Sql 在时间数据中创建缺失的分钟记录以完成一天(每天1440条记录)

Sql 在时间数据中创建缺失的分钟记录以完成一天(每天1440条记录),sql,database,sql-server-2008,tsql,Sql,Database,Sql Server 2008,Tsql,我有一个基于web分析的数据源,表基数为1行=选定日期范围内每个日期每小时的每分钟。有时,此数据不会返回一天中每分钟的记录(在该分钟内,数据源中没有注册任何活动)。示例如下,缺少的分钟数为17:26和17:28: +------------+------+--------+--------+---------+ | Date | Hour | Minute | Visits | Bounces | +------------+------+--------+--------+----

我有一个基于web分析的数据源,表基数为1行=选定日期范围内每个日期每小时的每分钟。有时,此数据不会返回一天中每分钟的记录(在该分钟内,数据源中没有注册任何活动)。示例如下,缺少的分钟数为17:26和17:28:

+------------+------+--------+--------+---------+
|    Date    | Hour | Minute | Visits | Bounces |
+------------+------+--------+--------+---------+
| 2015-09-07 |   17 |     24 |    499 |      58 |
| 2015-09-07 |   17 |     25 |     32 |       4 |
| 2015-09-07 |   17 |     27 |     12 |       1 |
| 2015-09-07 |   17 |     29 |      6 |       0 |
+------------+------+--------+--------+---------+
出于我们的目的,我们需要每天等于它的完整分钟范围,并且这些没有注册活动的记录不应该不存在于数据库中,而是作为记录输入,度量值列为null,这将输出以下内容:

+------------+------+--------+--------+---------+
|    Date    | Hour | Minute | Visits | Bounces |
+------------+------+--------+--------+---------+
| 2015-09-07 |   17 |     24 |    499 |      58 |
| 2015-09-07 |   17 |     25 |     32 |       4 |
| 2015-09-07 |   17 |     26 |      0 |       0 |
| 2015-09-07 |   17 |     27 |     12 |       1 |
| 2015-09-07 |   17 |     28 |      0 |       0 |
| 2015-09-07 |   17 |     29 |      6 |       0 |
+------------+------+--------+--------+---------+

我曾考虑过使用set函数来包含不存在的分钟,但这会返回丢失的记录,因为实际上只是分钟,没有日期或小时数据会被带入记录中,所以我不得不承认我有点困惑

您可能需要一个会议桌。有一些程序可以自动创建分钟范围。寻找一个有天的样品

CREATE TABLE minute
    ([Date] datetime, [Hour] int, [Minute] int)
GO

INSERT INTO minute
    ([Date], [Hour], [Minute])
VALUES
    ('2015-09-07 00:00:00', 17, 24),
    ('2015-09-07 00:00:00', 17, 25),
    ('2015-09-07 00:00:00', 17, 26),
    ('2015-09-07 00:00:00', 17, 27),
    ('2015-09-07 00:00:00', 17, 29)


虽然可能有更好、更简单的选择,但我会这样做:

  • 创建一个包含
    小时
    分钟
    所有值的表(1440行)
  • 插入缺少的值
  • 假设您有一个名为
    tbl\u hour\u minute
    的表,其结构如下:

    小时|分钟
    ------+--------
    0    |   0
    0    |   1
    ...
    0    |   59
    1    |   0
    ...
    23   |   59
    
    您可以这样做来获取丢失的分钟数:

    select c.*
    from 
    (
    select a.date, b.hour, b.minute
    from (select distinct date from your_table) as a
         tbl_hour_minute as b
    ) as c
    left join your_table as t on c.date = t.date and c.hour = t.hour and c.minute = t.minute
    where t.hour is null and t.minute is null;
    

    然后,您可以将数据插入到表中,并在需要时添加所需的零。

    Ah当然!我曾考虑过使用标准联接,但不知何故忽略了这样一个事实,即我可以只使用包含日期的comp键!一点新鲜的想法非常有帮助,谢谢胡安。
    select c.*
    from 
    (
    select a.date, b.hour, b.minute
    from (select distinct date from your_table) as a
         tbl_hour_minute as b
    ) as c
    left join your_table as t on c.date = t.date and c.hour = t.hour and c.minute = t.minute
    where t.hour is null and t.minute is null;