SQL 服务器中日期时间属性中每个特定小时的增量组数

Incremental group number per specific hour in datetime attribute in SQL Server

下面是table

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')

我想在 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

您可以使用 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;