【发布时间】:2021-08-24 06:16:26
【问题描述】:
我正在创建一个 PostgreSQL 查询,我希望自动填写每一天的缺失记录。
我突然想到,我可以生成一个包含零值的表,然后将源表连接到它。
所以我创建了这个查询,但结果仍然不包含丢失的天数,只包含源数据库表中的现有记录。例如,缺少来自“2021-08-01 00:00:00”、“2021-08-07 00:00:00”或“2021-08-08 00:00:00”的记录。
SELECT
s."Date",
s."PowerOn",
s."Idle",
s."Run",
CONCAT_WS('%', ROUND(NULLIF(s."Run"::numeric, 0) / NULLIF(s."PowerOn"::numeric, 0) * 100, 2), '') As "Effectivity"
FROM (
SELECT d."Date", bigint '0' AS "PowerOn", bigint '0' AS "Idle", bigint '0' AS "Run", text '0 %' AS "Effectivity"
FROM (
SELECT generate_series(timestamp '2021-08-01 00:00:00'
, NOW()
, interval '1 day')::timestamp
) d("Date")) f
JOIN "Absolute_OEE" s ON s."Machine" = 'Machine01'
WHERE
s."Date" > '2021-08-01 00:00:00'
GROUP BY s."Date",s."PowerOn", s."Idle", s."Run"
ORDER BY s."Date"
结果:
您能否告诉我如何对记录进行分组并为未记录的日期添加零值?
感谢您的建议和提示。
【问题讨论】:
-
我会尝试生成仅包含日期的日期系列,并使用真实数据生成
OUTER JOIN- 这将使用NULL值填充缺失的数据,例如SELECT generateseries(...) AS some_name LEFT OUTER JOIN your_table ON ...。 -
与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
标签: sql postgresql join