Sql postgres查询的思路
我有一个postgres查询,需要在定义的6个月内为每个ID获取一些事实,从最后一个月开始,它们处于活动状态,我在where子句中使用了2个子查询 我已经完成了下面的查询,该查询适用于1个id输入,但不确定如何同时对多个id进行查询,以便获得每个id的最大周期和最大-6,因为每个id具有不同的最大周期Sql postgres查询的思路,sql,postgresql,max,inner-join,window-functions,Sql,Postgresql,Max,Inner Join,Window Functions,我有一个postgres查询,需要在定义的6个月内为每个ID获取一些事实,从最后一个月开始,它们处于活动状态,我在where子句中使用了2个子查询 我已经完成了下面的查询,该查询适用于1个id输入,但不确定如何同时对多个id进行查询,以便获得每个id的最大周期和最大-6,因为每个id具有不同的最大周期 SELECT key_id, period_id, value1, run_version, gs.run_vs =
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的最后6个月的值和id具有不同的结束日期,因此它们可能不同。您可以加入一个聚合查询,一次计算所有密钥的最大期限:
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_id
谢谢,它是有效的,只是出于某种原因,即使周期id>=k.max\u period\u id-7,我得到的周期也多于6个,实际上它们都是从max开始的。@Amdbi:my bad,我在连接中缺少一个键id条件。固定的不过我还是建议使用第二种,我认为它更有效。谢谢!在我发布了关于缺失条件的评论后,我注意到了这一点。工作很有魅力!