我有一个postgres查询,它需要在从最后一个月开始的6个月内为每个ID获取一些事实(我在where子句中使用了2个子查询)。
我已经做了下面的查询,它适用于1个id输入,但不确定如何在同一时间为多个id做它,以便它将获得每个ID的最大周期和max-6,因为每个ID有不同的最大周期。
SELECT
key_id,
period_id,
value1,
run_version,
gs.run_vs = MAX(gs.run_vs) OVER(PARTITION BY key_id, run_id) AS max_version
FROM gs
WHERE key_id=23
AND gs.period_id <= (SELECT
MAX(period_id)
FROM gs
WHERE key_id=23
)
AND gs.period_id >(SELECT
MAX(period_id)-7
FROM gs
WHERE key_id=23
)这个查询是一个更广泛的查询的一部分,其中一个要求是使id和id的最后6个月的值具有不同的结束日期,因此它们可能不同。
发布于 2020-09-23 21:58:03
您可以使用聚合查询进行join,该查询一次计算所有键的最大周期:
SELECT
g.key_id,
g.period_id,
g.value1,
g.run_version,
MAX(g.run_vs) OVER(PARTITION BY g.key_id, g.run_id) AS max_version
FROM gs g
INNER JOIN (SELECT key_id, MAX(period_id) max_period_id FROM gs GROUP BY key_id) k
ON g.key_id = k.key_id
AND g.period_id >= k.max_period_id - 7
AND g.period_id < k.max_period_id但是窗口函数在这里可能更有效:
SELECT
key_id,
period_id,
value1,
run_version,
MAX(run_vs) OVER(PARTITION BY key_id, run_id) AS max_version
FROM (
SELECT gs.*,
MAX(max_period_id) OVER(PARTITION BY key_id) AS max_period_id
FROM gs
) g
WHERE period_id >= max_period_id - 7 AND period_id < max_period_idhttps://stackoverflow.com/questions/64029550
复制相似问题