我试图弄清楚如何检索时间序列数据中的空白。下面是我的例子。
CREATE TABLE MYTABLE
([ID] int, [DATE] DATE)
;
INSERT INTO MYTABLE
([ID], [DATE])
VALUES
(1, '2022-01-01'),
(1, '2022-02-01'),
(1, '2022-03-01'),
(1, '2022-04-01'),
(1, '2022-05-01'),
(1, '2022-06-01'),
(1, '2022-10-01'),
(1, '2022-11-01'),
(1, '2022-12-01'),
(2, '2022-01-01'),
(2, '2022-02-01'),
(2, '2022-03-01'),
(2, '2022-04-01'),
(2, '2022-05-01'),
(2, '2022-06-01'),
(2, '2022-07-01'),
(2, '2022-08-01'),
(2, '2022-10-01'),
(2, '2022-11-01'),
(2, '2022-12-01')
;
日期字段遵循一个约定,其中日期始终是每月的 1 号。对于上面的示例,差距如下。
| ID | DATE |
|----|------------|
| 1 | 2022-07-01 |
| 1 | 2022-08-01 |
| 1 | 2022-09-01 |
| 2 | 2022-09-01 |
我将如何编写查询以返回上述结果?
这是一种简单的方法。首先,您在 MYTABLE 中生成介于 min 和 max 之间的所有日期:
现在您可以在 MYTABLE 中的用户集和用户集之间获取笛卡尔积
我使用了 "," 连接,因为我不确定 SQL 服务器是否支持显式 CROSS JOIN。最后,您可以从该集合中减去所有现有行:
我建议您避免使用 DATE 和 ID 等标识符,但我认为这只是一个示例
编辑: CROSS JOIN 显然可以根据我的小提琴工作,因此您可以将其改写为:
小提琴