【问题标题】:How to generate a monthly report filling missing days of the month with zero如何生成月度报告,用零填充一个月中的缺失天数
【发布时间】:2021-12-10 17:07:37
【问题描述】:

假设我在 QuestDB 表上有以下数据:

ts               | item
------------------------
2020-01-02T10:12 | a
2020-01-02T10:20 | b
2020-01-03T11:20 | a
2020-01-03T11:30 | b
2020-01-03T11:40 | c

我可以执行以下查询来计算特定月份按天抽样的不同项目:

SELECT DAY(ts) as day, COUNT_DISTINCT(item) AS count_items
FROM my_table
WHERE ts IN '2020-01'
SAMPLE BY d FILL(0);

我得到以下数据:

day | count_items
------------------
2   | 2
3   | 3

我想要一个完整的月度报告而不是那个结果(即使是在表格没有数据并将它们填充为零的日子),如下所示:

day | count_items
------------------
1   | 0
2   | 2
3   | 3
4   | 0
5   | 0
6   | 0
...
31  | 0

产生这种结果的最佳方法是什么?我一直在考虑将 JOIN 与生成特定月份的所有日期的表一起使用,但 QuestDB 没有实现 LEFT JOIN。

是否存在使用 QuestDB 生成此类报告的简单方法?

【问题讨论】:

    标签: questdb


    【解决方案1】:

    你可以用左连接做

    SELECT x as day, COALESCE(sb.count_items, 0) AS count_items
    from long_sequence(31) ls
    LEFT JOIN (
       SELECT DAY(ts) as day, COUNT_DISTINCT(item) AS count_items
       FROM my_table
       WHERE ts IN '2020-01'
       SAMPLE BY d
    ) AS sb ON sb.day = ls.x
    

    【讨论】:

    • 我做了一些改变,包括转换和替换接收DAYS_IN_MONTH而不是文字的长序列调用。请亚历克斯您可以批准更改,以便我可以将此设置为接受的答案吗?
    • @jfcalvo 如果此答案对您有帮助,请投票支持并考虑将其标记为解决方案。如果您想显示您的改进,请添加您的答案。可以投票和接受其他人并添加自己的答案。
    【解决方案2】:

    我已经修改了 Alex 的答案,添加了 CAST(DAY(ts) AS LONG)(没有这个,左连接条件中会引发类型错误)并使用 DAYS_IN_MONTH 函数:

    SELECT x as day, COALESCE(sb.count_items, 0) AS count_items
    from long_sequence(DAYS_IN_MONTH('2020-01') ls
    LEFT JOIN (
       SELECT CAST(DAY(ts) AS LONG) as day, COUNT_DISTINCT(item) AS count_items
       FROM my_table
       WHERE ts IN '2020-01'
       SAMPLE BY d
    ) AS sb ON sb.day = ls.x
    

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 2023-02-03
      • 1970-01-01
      • 2021-06-11
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      相关资源
      最近更新 更多