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;
下面是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;