【问题标题】:Group by Time Interval按时间间隔分组
【发布时间】:2011-12-20 23:48:13
【问题描述】:

我需要将我的表分组为 15 分钟的间隔。我可以这样做:

select dateadd(minute, datediff(minute, 0, ts) / 15 * 15, 0), sum (goodpieces) 
from StationCount 
Group by dateadd(minute, datediff(minute, 0, ts) / 15 * 15, 0)

但要在图表中显示返回的数据,我还需要插入没有任何数据且当前未出现在我的选择语句中的区间。我如何插入这些?

【问题讨论】:

    标签: sql sql-server tsql group-by


    【解决方案1】:

    创建一个以 15 分钟为增量的带有每个可能时间戳的表,然后从它向上面的查询执行 LEFT JOIN。

    SELECT * FROM timestamps LEFT JOIN (SELECT dateadd......) ON timestamps.timestamp = StationCount.ts
    

    如果您知道您的图表始终涵盖 24 小时时段,您只需创建一个包含数字 0-95 的表格,然后将每个条目添加到图表的开始时间。

    SELECT *
      FROM (SELECT dateadd(minute, <starttime>, number*15) timestamp FROM numbers) timestamps LEFT JOIN
           (SELECT dateadd......) ON timestamps.timestamp = StationCount.ts
    

    【讨论】:

    • 你能告诉我为什么数字表在 24 小时内应该有 95 个条目吗?
    • 96 个条目,而不是 95 个(包括 0-95),因为 24*60/15=96。
    • 好的,你是不是在选择的第一部分缺少数字 *15 ?
    【解决方案2】:

    这样的事情可能会对你有所帮助。

    declare @startDate datetime
            ,@endDate datetime
    
    set @startDate = '2011-10-25'
    set @endDate = '2011-10-26'
    
    ;with fifteenMinutes
    as
    (
        select  dateadd(minute, datediff(minute, 0, @startDate) / 15 * 15, 0) as q
        UNION ALL
        select  dateadd(minute, 15, q)
        from fifteenMinutes
        where q < @endDate
    )
    
    select * from fifteenMinutes
    

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2019-06-28
      • 2018-10-12
      • 2016-09-21
      • 2017-09-06
      • 2021-03-06
      • 2016-10-06
      • 1970-01-01
      相关资源
      最近更新 更多