【问题标题】:group by hour exclude last hour where less data按小时分组排除数据较少的最后一小时
【发布时间】:2017-05-31 09:14:17
【问题描述】:

我有一个表格,其中有列 starttime datetime 可用于不同的日期和时间,数据持续时间为 15 分钟,例如

2017-05-31 13:00:00
2017-05-31 13:15:00
2017-05-31 13:30:00
2017-05-31 13:45:00
2017-05-31 14:00:00
2017-05-31 14:15:00
2017-05-31 14:30:00
2017-05-31 14:45:00
2017-05-31 15:00:00
2017-05-31 15:15:00

现在我想按小时获取数据和分组,但直到最后一个小时,在这种情况下,所有分钟都可用,例如 2017-05-31 14:45:00。

在丢失的数据之间并不重要,只有最后一小时的数据很重要。

【问题讨论】:

  • ,您的预期输出是什么,您使用的是哪个 DBMS。
  • 你的问题不清楚。您是否只期望 2017-03-31 14:45:00 作为上述数据集的输出?如果是这样,这是因为它是有记录 00153045 分钟的最新小时,而小时 15:00 没有?

标签: sql-server


【解决方案1】:

我了解您只想查看该小时有 4 条记录的小时数。您可以简单地按小时分组并使用有。

declare @table table (starttime datetime)
insert into @table values
('2017-05-31 13:00:00'),
('2017-05-31 13:15:00'),
('2017-05-31 13:30:00'),
('2017-05-31 13:45:00'),
('2017-05-31 14:00:00'),
('2017-05-31 14:15:00'),
('2017-05-31 14:30:00'),
('2017-05-31 14:45:00'),
('2017-05-31 15:00:00'),
('2017-05-31 15:15:00')


Select dateadd(hour,datepart(hour,starttime), cast(cast(starttime as date)as datetime)) aggrHour
from @table
group by dateadd(hour,datepart(hour,starttime), cast(cast(starttime as date)as datetime))
having count(starttime) = 4

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以使用以下查询

    DECLARE @SampleData AS TABLE
    (
        DateValue datetime
    )
    
    INSERT INTO @SampleData
    (
        DateValue
    )
    VALUES
    ('2017-05-31 13:00:00'),
    ('2017-05-31 13:15:00'),
    ('2017-05-31 13:30:00'),
    ('2017-05-31 13:45:00'),
    ('2017-05-31 14:00:00'),
    ('2017-05-31 14:15:00'),
    ('2017-05-31 14:30:00'),
    ('2017-05-31 14:45:00'),
    ('2017-05-31 15:00:00'),
    ('2017-05-31 15:15:00')
    
    ;WITH temp AS
    (
        SELECT  *, 
              count(*) OVER(PARTITION BY CAST(sd.DateValue as date),datepart(hour,sd.DateValue) ) AS CountHour
        FROM @SampleData sd
    )
    SELECT  TOP 1 
           t.DateValue
    FROM temp t
    WHERE t.CountHour = 4 -- all mins are avaiable
    ORDER BY t.DateValue DESC
    

    返回

    DateValue
    2017-05-31 14:45:00.000
    

    【讨论】:

    • 您应该按日期和小时进行分区。否则,如果输入数据涵盖多天,此解决方案可能不起作用。
    【解决方案3】:

    您可以先复制和/或更改表格,然后将日期时间的子字符串提取到小时。

    也可以使用 CASE。虽然非常冗长,而且此示例无法跨多天运行。

    GROUP BY
    CASE
        WHEN datetime LIKE '% 13%' THEN '13'
        WHEN datetime LIKE '% 14%' THEN '14'
        ...
    END
    

    【讨论】:

    • datepart(hour,<Date Value>)函数存在时为什么要使用字符串操作?
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2020-04-19
    相关资源
    最近更新 更多