Sql 在时间数据中创建缺失的分钟记录以完成一天(每天1440条记录)
我有一个基于web分析的数据源,表基数为1行=选定日期范围内每个日期每小时的每分钟。有时,此数据不会返回一天中每分钟的记录(在该分钟内,数据源中没有注册任何活动)。示例如下,缺少的分钟数为17:26和17:28: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 | +------------+------+--------+--------+----
+------------+------+--------+--------+---------+
| 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;