【问题标题】:Group by datetime minutes - Show minutes with 0 entries in database?按日期时间分钟分组 - 显示数据库中有 0 个条目的分钟?
【发布时间】:2017-06-20 16:25:40
【问题描述】:

我正在尝试编写一个 T-SQL 查询,该查询在特定时间段内查找表中的条目数量,然后按分钟(条目/分钟)对它们进行分组。 但我无法让它显示 0 个条目的分钟数。

我的查询看起来像:

select
[Minute],
Files
from
(
    select 
        (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime) / 1) as [Minute] ,
        count(*) as Files
            from TransferLog
            WHERE RegTime BETWEEN '2017-02-02 17:00:00.000' AND '2017-02-03 04:00:00.000'
        group BY
        (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime) / 1) 
) x  order by [Minute]

有什么想法吗?

编辑1。例外输出将显示分钟,表中没有条目。此外,当发生这种情况时,查询相当不可用,因为我不知道哪一分钟没有数据。例如,如果我想要 800 分钟的数据,但有 20 分钟没有数据写入表,这只会显示 780 分钟的数据。有没有为此目的对数据进行排序或修改查询?

Expected output:
Minute | Files
0   685
1   0
2   672
3   0
4   415
5   434
6   746

-

Current Output:
Minute | Files
0   685
1   672
2   415
3   434
4   746

【问题讨论】:

  • 结果中的每一行都是从输入表中的一行或多行生成的。您不会得到带有零的行,因为...没有行可以提供该日期时间值。
  • 您可能需要加入日历表以获取差异未出现在数据集中的分钟数。
  • 请发布您的表架构和预期输出。

标签: sql-server tsql datetime sql-server-2016


【解决方案1】:

您可以创建一个临时表,其中包含从 1 到您拥有的最大分钟(例如使用 this tecnique)的所有分钟数,然后您可以将数据表与临时表一起使用零值替换空值.

因此,您应该列出所有分钟以及您在其他地方有数据和零的值。

代码如下:

declare @max_minute      int
declare @dataTable       table ([Minute] int, Files int)

--insert your data into a temp table
insert into @dataTable
select  [Minute],   Files
from
(select 
        (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime) / 1) as [Minute] ,
        count(*) as Files
            from TransferLog
            WHERE RegTime BETWEEN '2017-02-02 17:00:00.000' AND '2017-02-03 04:00:00.000'
        group BY
        (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime) / 1) 
) x  order by [Minute]

--calculate maximum minute from your data
select @max_minute = max([Minute]) from @dataTable

;
WITH gen AS (
    SELECT 1 AS Minute
    UNION ALL
    SELECT Minute+1 FROM gen WHERE Minute+1<=@max_minute
)
SELECT  M.Minute, isnull(D.Files,0) as Files  
FROM gen  M left join @dataTable D on M.Minute = D.Minute
option (maxrecursion 10000)

【讨论】:

  • 我会在星期一试试这个。非常感谢!
  • 哇!我无法控制自己,不得不立即尝试,它就像一个魅力。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多