SQL中要分组的累积计数

问题描述 投票:0回答:2

我有一个返回日期列表的查询,现在我想要实现的是将它们分组并用空标识分组。

示例查询:

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
sql sql-server row-number
2个回答
2
投票

您似乎想要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值。这似乎与您要执行的操作非常一致。


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  
© www.soinside.com 2019 - 2024. All rights reserved.