0

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

这是我正在使用的示例 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 和 HAVING 得到了一个简单的查询,但这不足以满足上述用例。我打算用这个或使用 PARTITION BY 编写 CTE,但再次陷入无法满足所有条件的困境。

4

1 回答 1

0

为什么不跳过HAVING1 月 3 日的所有数据,尽管源 A 中没有 1 月 2 日的数据。

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
于 2020-06-10T13:17:31.070 回答