Инкрементальный номер группы для указанного c час в атрибуте datetime в SQL Сервер - PullRequest
0 голосов
/ 14 января 2020

У меня есть таблица ниже.

create table timeTest(id, datetime)

insert into timeTest 
values (1, '2010-12-31 23:59:11.000'),
       (2, '2011-01-01 00:01:11.000'),
       (3, '2011-01-01 00:02:11.000'),
       (4, '2011-01-01 01:05:11.000')

Я хочу создать номер группы для каждого указанного c часа в атрибуте datetime. Таким образом, каждый час каждого года, месяца и дня должен быть уникальным. Я пробовал это с помощью запроса ниже. Но этот запрос дает только значение «1» для каждой строки.

SELECT 
    id, datetime, 
    DENSE_RANK() OVER (ORDER BY datepart(year, (datepart(month,datepart(day, datepart(hour, datetime)))))) AS hourNumber
FROM
    timeTest
ORDER BY 
    hourNumber

Желаемый результат должен быть:

id  datetime                     hourNumber
--------------------------------------------
1   2010-12-31 23:59:11.000      0
2   2011-01-01 00:01:11.000      1
3   2011-01-01 00:02:11.000      1
4   2011-01-01 01:05:11.000      2

1 Ответ

2 голосов
/ 14 января 2020

Вы можете использовать dense_rank(). Вот один из методов:

select t.*,
       dense_rank() over (order by cast(datetime as date), datepart(hour, datetime)) - 1 as hournumber
from timeTest  t;

Примечание. При этом игнорируются пропущенные часы. Если вы хотите количество часов с самого раннего часа, используйте datediff() вместо:

select t.*,
       datediff(hour, min(datetime) over (), datetime) as hournumber
from timeTest  t;
...