2011-11-17 53 views
2

開始,我有以下表結構如何按日期範圍組從最初的日期

Key int 
MemberID int 
VisitDate DateTime 

怎麼能集團所有在指定日期範圍落下的日期說15的sameMember days..The第一次訪問應被視爲開始日期。

Key  ID  VisitDate(MM/dd/YY) 
1  1  02/01/11 
2  1  02/09/11 
3  1  02/12/11 
4  1  02/17/11 
5  2  02/03/11 
6  2  02/19/11 

在這種情況下,結果應該是要做到這一點是使用window aggregating

ID StartDate  EndDate  
1 02/01/11  02/12/11  
1 02/17/11  02/17/11  
2 02/03/11  02/03/11  
2 02/19/11  02/19/11  

回答

3

的一種方式。具體方法如下:

  1. 設置:

    DECLARE @data TABLE (
        [Key] int, ID int, VisitDate date 
    ); 
    
    INSERT INTO @data ([Key], ID, VisitDate) 
    SELECT 1, 1, '02/01/2011' UNION ALL 
    SELECT 2, 1, '02/09/2011' UNION ALL 
    SELECT 3, 1, '02/12/2011' UNION ALL 
    SELECT 4, 1, '02/17/2011' UNION ALL 
    SELECT 5, 2, '02/03/2011' UNION ALL 
    SELECT 6, 2, '02/19/2011'; 
    
  2. 查詢:

    WITH marked AS (
        SELECT 
        *, 
        Grp = DATEDIFF(DAY, MIN(VisitDate) OVER (PARTITION BY ID), VisitDate)/15 
        FROM @data 
    ) 
    SELECT 
        ID, 
        StartDate = MIN(VisitDate), 
        EndDate = MAX(VisitDate) 
    FROM marked 
    GROUP BY ID, Grp 
    ORDER BY ID, StartDate 
    
  3. 輸出:

    ID   StartDate EndDate 
    ----------- ---------- ---------- 
    1   2011-02-01 2011-02-12 
    1   2011-02-17 2011-02-17 
    2   2011-02-03 2011-02-03 
    2   2011-02-19 2011-02-19 
    

基本上,對於每一行,查詢計算相同IDVisitDate與第一個VisitDate之間的天數差值,並將其除以15.然後將結果用作分組標準。請注意,當/運算符的兩個操作數都是整數時,SQL Server將使用整數除法。

+0

嘿安德烈。這很好用。一個簡短的問題..如果我有兩列需要分組,那麼我們可能無法正確使用分區? –

+0

@AshleyJohn:我不確定你的意思,對不起。你可以在'PARTITION BY'子句中指定多個列,如果這是你所問的,只需用逗號分隔它們:'PARTITION BY Column1,Column2,Column3'。它們也可以是表達式(如在「GROUP BY」中)。 –

+0

oK。我有一個誤解。認爲我們可以只有一個分欄的列...感謝澄清.. –