Можно ли сгруппировать в SQL? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть запрос, который возвращает список дат, теперь я хочу сгруппировать их и идентифицировать группировку с нулем.

Пример запроса:

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

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

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  
1 голос
/ 18 октября 2019

Похоже, вам нужен совокупный счет значений 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. Кажется, это вполне соответствует тому, что вы хотите сделать.

...