累计计数 SQL
Cumulative count to group in SQL
我有一个 returns 日期列表的查询,现在我想要实现的是对它们进行分组并用 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
输出:
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
我想要实现的是这个期望的输出:
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
所以我可以将这些日期分为两组。
其他示例输出:
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;
此returns分组值为1、2、3等为组。 NULL
值都具有 0
的值。这看起来和你想做的很一致。
我有一个 returns 日期列表的查询,现在我想要实现的是对它们进行分组并用 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
输出:
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
我想要实现的是这个期望的输出:
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
所以我可以将这些日期分为两组。
其他示例输出:
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;
此returns分组值为1、2、3等为组。 NULL
值都具有 0
的值。这看起来和你想做的很一致。