SQL分组差距

aut*_*tic 7 sql t-sql sql-server sql-server-2005

在SQL Server 2005中,我有一个表格,其数据如下所示:

WTN------------Date  
555-111-1212  2009-01-01  
555-111-1212  2009-01-02  
555-111-1212  2009-01-03  
555-111-1212  2009-01-15  
555-111-1212  2009-01-16  
212-999-5555  2009-01-01  
212-999-5555  2009-01-10  
212-999-5555  2009-01-11 
Run Code Online (Sandbox Code Playgroud)

从这个我想提取WTN,Min(日期),Max(日期)扭曲是我想在日期中有间隙时也要打破,所以从上面的数据来看,我的结果应该是这样的:

WTN------------ MinDate---- MaxDate  
555-111-1212   2009-01-01  2009-01-03  
555-111-1212   2009-01-15  2009-01-16  
212-999-5555   2009-01-01  2009-01-01  
212-999-5555   2009-01-10  2009-01-11  
Run Code Online (Sandbox Code Playgroud)
  1. 如何在SQL Select/Group By中执行此操作?
  2. 这可以在没有列表或列表的情况下完成,我想要识别我想要识别的空白(这里的日期)吗?

Aar*_*and 8

为什么每个人都这么死,不能使用桌子来做这种事情?数字表或日历表占用这么小的空间,如果足够引用,可能在内存中.您还可以使用ROW_NUMBER()轻松地导出数字表.使用数字表可以帮助理解查询.但是这里有一个不那么直截了当的例子,一段时间我从Plamen Ratchev那里捡到的一招,希望它有所帮助.

DECLARE @wtns TABLE
(
    WTN    CHAR(12),
    [Date] SMALLDATETIME
);

INSERT @wtns(WTN, [Date])
          SELECT '555-111-1212','2009-01-01'
UNION ALL SELECT '555-111-1212','2009-01-02'
UNION ALL SELECT '555-111-1212','2009-01-03'
UNION ALL SELECT '555-111-1212','2009-01-15'
UNION ALL SELECT '555-111-1212','2009-01-16'
UNION ALL SELECT '212-999-5555','2009-01-01'
UNION ALL SELECT '212-999-5555','2009-01-10' 
UNION ALL SELECT '212-999-5555','2009-01-11';

WITH x AS
(
    SELECT
        [Date],
        wtn,
        part = DATEDIFF(DAY, 0, [Date]) 
        + DENSE_RANK() OVER
        (
            PARTITION BY wtn
            ORDER BY [Date] DESC
        )
    FROM @wtns
)
SELECT 
    WTN, 
    MinDate = MIN([Date]),
    MaxDate = MAX([Date])
FROM
    x
GROUP BY 
    part,
    WTN
ORDER BY
    WTN DESC,
    MaxDate;
Run Code Online (Sandbox Code Playgroud)

  • 但是数字表对于许多事情是如此有用,你不应该重复定义它.在我看来,这比永久表更好. (2认同)