SQL: ранжировать / сгруппировать столбец по дате - PullRequest
1 голос
/ 07 апреля 2020

Использование SQL Server Management Studio v17.9.1

Я пытаюсь упорядочить / упорядочить / сгруппировать некоторые данные по сайту и площади по дате, но я изо всех сил пытаюсь разобраться, не заняв место в рейтинге область в алфавитном порядке и ранжирование по самой ранней дате ее появления.

Вот данные, которые у меня есть:

Site   |   Area   |   Space   |   Date
DCG        X          7           02/02/2020 12:13
DCG        X          5           04/02/2020 11:47
DCG        X          12          10/02/2020 15:14
GNL        U          0           03/03/2020 18:35
GNL        A          4           04/03/2020 08:28
GNL        C          4           06/03/2020 09:07
GNL        B          1           16/03/2020 07:10
DPL        U          0           18/03/2020 09:28
DPL        A          1           18/03/2020 09:36
DPL        A          1           20/03/2020 20:04
SGR        F          2           21/03/2020 19:42
SGR        B          2           22/03/2020 10:30
SGR        C          3           24/03/2020 08:17
SGR        F          1           01/04/2020 09:00
SGR        E          1           02/02/2020 10:57
SGR        F          1           02/02/2020 15:50

Я хочу добавить 2 столбца, которые ранжируют / группируют сайт и область в в порядке возрастания даты, например так:

Site   |   Area   |   Space   |   Date              |   Site Order   |   Area Order   |
DCG        X          7           02/02/2020 12:13         1                 1
DCG        X          5           04/02/2020 11:47         1                 1
DCG        X          12          10/02/2020 15:14         1                 1
GNL        U          0           03/03/2020 18:35         2                 1
GNL        A          4           04/03/2020 08:28         2                 2
GNL        C          4           06/03/2020 09:07         2                 3 
GNL        B          1           16/03/2020 07:10         2                 4
DPL        U          0           18/03/2020 09:28         3                 1
DPL        A          1           18/03/2020 09:36         3                 2 
DPL        A          1           20/03/2020 20:04         3                 2
SGR        F          2           21/03/2020 19:42         4                 1
SGR        B          2           22/03/2020 10:30         4                 2
SGR        C          3           24/03/2020 08:17         4                 3
SGR        F          1           01/04/2020 09:00         4                 1
SGR        E          1           02/02/2020 10:57         4                 4
SGR        F          1           02/02/2020 15:50         4                 1

Извиняюсь, если я не дал понять,

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы можете использовать min() в качестве оконной функции, чтобы получить минимальную дату для каждого сайта и комбинации сайта / области. Затем используйте dense_rank():

select t.*,
       dense_rank() over (order by min_site_date, site) as site_seqnum,
       dense_rank() over (partition by site order by min_site_date) as area_seqnum
from (select t.*,
             min(date) over (partition by site) as min_site_date,
             min(date) over (partition by site, area) as min_site_area_date
      from t
     ) t
0 голосов
/ 07 апреля 2020

Вы можете использовать оконную функцию:

select t.*, 
       dense_rank() over (order by site, site_date) as site_sequence,
       dense_rank() over (partition by site order by area, site_area_date) as area_sequence
from (select t.*,
            min([date]) over (partition by [site]) as site_date,
            min([date]) over (partition by [site], area) as site_area_date
      from table t
     ) t;
...