我有一个查询,它会在一天内(简化)返回设备中的所有消息:
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
答案 0 :(得分:4)
你可以通过模数(%)来完成,如下所示:
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(Quarter)。我认为这可以解决你的问题。
注意:我没有使用
Seconds
,因为您按每分钟添加了数据 你的语言。
答案 1 :(得分:2)
如果您在一分钟内有多行或行与小时:分钟模式不完全匹配,您可以使用以下内容:
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
答案 2 :(得分:0)
您可以简单地使用“喜欢”条件:
and date like '%00:00.000' or date like '15:00.000' ...
答案 3 :(得分:0)
在日期的分钟部分使用模数函数
select *
from mytable T1
where datepart(minute, T1.date)%15 = 0
答案 4 :(得分:0)
我首先要将row_number分区为15分钟。
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分钟块中的实际第一个日期时间而不是块舍入日期,可以在外部选择中将Truncdate更改为日期。
是的,我没有真正读过这个问题。这种方法的优点是,即使它在块开始之后出现,它仍然会在每个块中获得第一个值,我现在注意到这不是解决方案的要求。