如何汇总SQL中存在空白的历史数据?



我有一些来自各种来源的历史数据,我想将它们编译成折线图。

这是我正在使用的示例SQL小提琴 https://www.db-fiddle.com/f/oprEgt1gEz55tY5xumU6Jz/1

但是,我需要处理各种情况。在以下情况下,我总是有 3 个来源(A、B、C(。B 和 C 总是引入值,但 A 是遇到问题的运行。

用户要求提供 1 月 1 日至 1 月 5 日的数据。

  1. 来源 A 无法在 1 月 3 日提供数据。我的折线图应显示 1 月 1 日、2 日、4 日和 5 日的值。它跳过 3,因为不存在源 A 的值。
  2. 由于缺少连接,源 A 在 1 月 3 日之后未提供任何更新。我的折线图应该显示 1 月 1 日和 2 日的值。没有 3、4 或 5,因为我们缺少源 A 中的值。
  3. 来源 A 在 1 月 3 日之后关闭。我的折线图应该显示 1 月 1 日至 5 日的所有值。即使源 A 关闭,我们仍然希望看到所有值。
  4. 源 A 在 1 月 3 日之后作为新数据源出现。我的折线图应该显示 1 月 1 日至 5 日的所有值。
  5. 源 A 只能从 1 月 3 日开始提供更新(即使他们应该在 1 月 1 日以后向我们提供值(。我的折线图应该只显示 1 月 3 日至 5 日的值。

我正在尝试在MySQL中执行此操作。我得到了一个简单的查询,使用 GROUP BY 和 HAVE,但这还不足以满足上述用例。我打算用这个或使用 PARTITION BY 编写 CTE,但再次坚持无法满足所有条件。

你为什么不跳过HAVING,这样你就可以得到 1 月 3 日的所有数据,尽管 1 月 2 日的源 A 中没有数据。

SELECT sample_date, COUNT(source_data_id) AS NUMBER_OF_SOURCES, 
SUM(value) AS TOTAL_VALUE
FROM sample_history_data
WHERE SOURCE_DATA_ID IN ('A','B','C')
GROUP BY sample_date
ORDER BY sample_date ASC;
sample_date NUMBER_OF_SOURCES   TOTAL_VALUE
2001-01-01  3   30
2001-01-02  3   30
2001-01-03  2   20
2001-01-04  3   30
2001-01-05  3   30

最新更新