SQL Server一天中每小时返回4行

时间:2018-01-08 09:34:18

标签: sql sql-server

我有一个查询,它会在一天内(简化)返回设备中的所有消息:

    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

5 个答案:

答案 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更改为日期。

是的,我没有真正读过这个问题。这种方法的优点是,即使它在块开始之后出现,它仍然会在每个块中获得第一个值,我现在注意到这不是解决方案的要求。