【问题标题】:How to find missing dates AND missing period in sql table within a given range?如何在给定范围内的 sql 表中查找缺失的日期和缺失的期间?
【发布时间】:2022-10-05 23:23:52
【问题描述】:

假设存在一个名为:RandomPrice总结,其日期范围为2022 年 10 月 1 日星期三 00:00:00 GMT+01002022 年 10 月 3 日星期三 00:00:00 GMT+0100, 期间从1-3和费用如下图:

date period cost
Wed Oct 01 2022 00:00:00 GMT+0100 (British Summer Time) 1 10
Wed Oct 01 2022 00:00:00 GMT+0100 (British Summer Time) 2 20
Wed Oct 01 2022 00:00:00 GMT+0100 (British Summer Time) 3 10
Wed Oct 03 2022 00:00:00 GMT+0100 (British Summer Time) 1 20
Wed Oct 03 2022 00:00:00 GMT+0100 (British Summer Time) 2 20

在上表中,我们如何检查所有缺失的日期和缺失的时期?

例如,我们需要一个查询WHERE SETTLEMENT_DATE BETWEEN TIMESTAMP \'10-01-2022\' AND TIMESTAMP \'10-03-2022\',它的缺失周期范围为 1-3。 因此,预期的答案应该返回类似于以下内容的内容:

missing_date missing_period
Wed Oct 02 2022 00:00:00 GMT+0100 (British Summer Time) 1
Wed Oct 02 2022 00:00:00 GMT+0100 (British Summer Time) 2
Wed Oct 02 2022 00:00:00 GMT+0100 (British Summer Time) 3
Wed Oct 03 2022 00:00:00 GMT+0100 (British Summer Time) 3
  • 仅标记您使用的数据库。
  • 一般的解决方案是拥有或生成您要检查的所有期间并将其与此表进行比较。您可以通过将句点存储在另一个表中来做到这一点,或者通过使用一些技巧通过递归或从已知的大表的 rownums 或类似的东西生成任意数量的行。

标签: sql database


【解决方案1】:

我们可以使用下面的日历表左反连接方法:

SELECT d.dt, p.period
FROM (SELECT '2022-10-01'::date AS dt UNION ALL
      SELECT '2022-10-02'::date UNION ALL
      SELECT '2022-10-03'::date) d
CROSS JOIN (SELECT 1 AS period UNION ALL SELECT 2 UNION ALL SELECT 3) p
LEFT JOIN RandomPriceSummary t
    ON t.date::date = d.dt AND t.period = p.period
WHERE t.date IS NULL
ORDER BY d.dt, p.period;

【讨论】:

  • 这是如何查询“10-01-2022”和时间戳“10-03-2022”范围内的日期的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2021-09-18
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多