[英]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
在這種情況下, RANK
和DENSE_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.