我有一个查询,它返回一天内来自设备的所有消息(简化(:
SELECT date, value
FROM Messages
WHERE date between '04/01/2018 00:00:00' AND '04/01/2018 23:59:59'
ORDER BY date asc
问题是它返回的行太多。例如,每分钟最少 1 行(一天 1440 行(,我必须在图表中打印它。
我怎样才能每刻钟返回第一行,以便每天每小时返回 4 行?
预期成果:
date value
2018-01-04 05:00:00.000 || 5,52
2018-01-04 05:15:00.000 || 5,48
2018-01-04 05:30:00.000 || 5,35
2018-01-04 05:45:00.000 || 5,42
用模数(%(来做到这一点,如下所示:
SELECT date, value
FROM Messages
WHERE date between '04/01/2018 00:00:00' AND '04/01/2018 23:59:59' and (datepart(minute,date) % 15) = 0
ORDER BY date asc;
此查询返回一个数据,其中包含分钟完全除以 15(季度(的日期行。我认为这可能会解决您的问题。
注意:我没有使用
Seconds
,因为您每分钟添加的数据根据 您的语言有问题。
如果您在一分钟内有多行或行与小时:分钟模式不完全匹配,则可以使用以下方法:
SELECT * INTO tab FROM (VALUES
('2018-01-01 05:00:01', 1),
('2018-01-01 05:10', 2),
('2018-01-01 05:20', 3),
('2018-01-01 05:28', 4),
('2018-01-01 05:31', 5)
) T(Date,Value)
SELECT Date,Value FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY CAST(Date AS DATE),
DATEPART(HOUR,Date),
DATEPART(MINUTE,Date)/15
ORDER BY Date) RowNum FROM tab
) T WHERE RowNum=1
它返回:
Date Value
---- -----
2018-01-01 05:00:01 1
2018-01-01 05:20 3
2018-01-01 05:31 5
您可以简单地使用"喜欢"条件:
and date like '%00:00.000' or date like '15:00.000' ...
在日期的分钟部分使用取模函数
select *
from mytable T1
where datepart(minute, T1.date)%15 = 0
我会从按 15 分钟间隔分区的row_number开始。
SELECT Truncdate, value FROM (
SELECT date
, value
, dateadd(minute, datediff(minute, 0, date) / 15 * 15, 0) AS TruncDate
, row_number() OVER (PARTITION BY dateadd(minute, datediff(minute, 0, date) / 15 * 15, 0) ORDER BY date) as RowNum
FROM messages
) x
WHERE x.rownum = 1
如果您想查看该 15 分钟块中的实际第一个日期时间而不是块舍入日期,则可以在外部选择中将截断日期更改为日期。
e:我实际上并没有读过这个问题。这种方法的优点是,即使它发生在块启动的那一刻之后,它仍然会获得每个块中的第一个值,我现在注意到这不是您的解决方案的要求。