簡體   English   中英

SQL 中分組的累積計數

[英]Cumulative count to group in SQL

我有一個返回日期列表的查詢,現在我想要實現的是對它們進行分組並使用 null 標識分組。

示例查詢:

SELECT  *,
ROW_NUMBER() OVER(PARTITION BY Date1.Date1 ORDER BY Date1.Date1) as rwnumber
FROM Date1
    LEFT JOIN Date2
        ON Date1.Date1= Date2.Date1

OUTPUT:

ID     DATE1         DATE2         rwnumber
1    06-10-2019    06-10-2019         1
1    06-25-2019    06-25-2019         1
1    07-10-2019    NULL               1
1    07-25-2019    07-25-2019         1    
1    08-10-2019    08-10-2019         1

我想要實現的是這個想要的 OUTPUT:

ID     DATE1         DATE2         rwnumber
1    06-10-2019    06-10-2019         1
1    06-25-2019    06-25-2019         1
1    07-10-2019    NULL               2 or 0
1    07-25-2019    07-25-2019         3    
1    08-10-2019    08-10-2019         3

所以我可以把這個日期分成兩組。

其他示例 Output:

ID     DATE1         DATE2         rwnumber
1    06-10-2019    06-10-2019        group 1
1    06-25-2019    NULL               
1    07-10-2019    07-10-2019        group 2      
1    07-25-2019    07-25-2019        group 2    
1    08-10-2019    08-10-2019        group 2

ID     DATE1         DATE2         rwnumber
1    06-10-2019    06-10-2019        group 1
1    06-25-2019    06-25-2019        group 1               
1    07-10-2019    07-10-2019        group 1      
1    07-25-2019    NULL                  
1    08-10-2019    08-10-2019        group 2

在這種情況下, RANKDENSE_RANK是確定性的,對於排序和分區列具有相同值的所有行最終將得到相同的結果,而ROW_NUMBER將任意(非確定性地)將遞增結果分配給綁定的行。

你不應該使用ROW_NUMBER()

  • 改用DENSE_RANK()
  • 刪除PARTITION BY

詢問,

    WITH T(ID, Date1)
         AS (SELECT 1,'06-10-2019' UNION ALL
             SELECT 1,'06-25-2019' UNION ALL
             SELECT 1,'07-10-2019' UNION ALL
             SELECT 1,'07-25-2019' UNION ALL
             SELECT 1,'08-10-2019')
    SELECT *,            
           DENSE_RANK() OVER(ORDER BY Month(Date1)) AS 'DENSE_RANK'
    FROM   T  

您似乎想要NULL值的累積計數:

select t.*,
       (case when date2 is null then 0
             else 1 + sum(case when date2 is null then 1 else 0 end) over (order by date1)
        end) as grouping
from t;

這將返回組的分組值 1、2、3 等。 NULL值的值都為0 這似乎與您想要做的非常一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM