SQL Server 每天每小时返回 4 行



我有一个查询,它返回一天内来自设备的所有消息(简化(:

    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:我实际上并没有读过这个问题。这种方法的优点是,即使它发生在块启动的那一刻之后,它仍然会获得每个块中的第一个值,我现在注意到这不是您的解决方案的要求。

最新更新