我有一个有小时级别记录的表,但它们不是24小时,如下午1点,下午2点等等。相反,我有超过24个数据点,如2:18,2:38,3: 10,3:45等等。
在我的最终数据集中,我只想要24个精确小时的数据点,我计划将数据点最接近未来一小时作为精确小时,然后删除其他小时。请参阅附图以获得清晰参考。
原始数据集:
而我希望最终的数据集像
最终期待:
所以,基本上我可能有一个小时范围的多个数据点,我必须设置最接近的一个与下一个确切的小时,并删除其他。
任何领导都应该采取什么方法。任何实现相同的方法?
答案 0 :(得分:0)
也许存在另一种归档方法,但我的如下: -
使用dateadd
功能添加额外的分钟数,以便到达下一个小时。
使用Where
子句通过Min
仅选择所需的输出
功能
<强>演示: - 强>
DDL&amp; DML
Create table Test (
[Date] date ,
[time] time(7),
col1 char (1),
col2 char (1) ,
col3 char(1)
)
go
insert into Test values ('02/02/2017' , '1:15' , 'a' , 'b' , 'c')
insert into Test values ('02/02/2017' , '1:35' , 'w' , 'e' , 'r')
insert into Test values ('02/02/2017' , '2:16' , 'q' , 'w' , 'e')
insert into Test values ('02/02/2017' , '3:48' , 'z' , 'x' , 'c')
insert into Test values ('02/02/2017' , '3:58' , 'b' , 'n' , 'm')
go
select * from Test
结果: -
查询
select [Date] ,
dateadd(minute,abs(datepart(minute,[time]) - 60),[time]) as [time],
col1 , col2 , col3
from test
where
datepart(hour,[time])
in
(
select
datepart(hour,[time])
from Test
group by datepart(hour,[time])
)
AND
abs(datepart(minute,[time]) - 60)
in
(
select
min(abs(datepart(minute,[time]) - 60))
from Test
group by datepart(hour,[time])
)
结果: -
答案 1 :(得分:0)
一种选择是使用CTE与ROW_NUMBER
和DATEADD
来获得下一轮时间:
;WITH CTE AS
(
SELECT [Date],
DATEADD(MINUTE, 60 - DATEPART(MINUTE, [time]), [time]) [Time],
col1,
col2,
col3,
ROW_NUMBER() OVER(PARTITION BY DATEPART(HOUR, [time]) ORDER BY Date, Time DESC) rn
FROM Test
)
SELECT CASE WHEN [Time] = '00:00:00' THEN DATEADD(DAY, 1, [Date]) ELSE [Date] END [Date],
[Time],
col1,
col2,
col3
FROM CTE
WHERE rn = 1
结果:
Date Time col1 col2 col3
02.02.2017 02:00:00 w e r
02.02.2017 03:00:00 q w e
02.02.2017 04:00:00 b n m