如何解决Postgres查询的想法
我有一个postgres查询,需要从定义的上个月有效的六个月开始为每个ID获取一些事实(这是我在where子句中使用2个子查询来完成的)。
我已经完成了下面的查询,该查询可用于1个id输入,但是不确定如何同时对多个id进行查询,以使其获得每个ID的最大期限和max-6不同的最大期限。
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的结束日期不同,因此为何可以有所不同。
解决方法
您可以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_id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。