首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgres查询的想法

postgres查询的想法
EN

Stack Overflow用户
提问于 2020-09-23 21:54:26
回答 1查看 39关注 0票数 0

我有一个postgres查询,它需要在从最后一个月开始的6个月内为每个ID获取一些事实(我在where子句中使用了2个子查询)。

我已经做了下面的查询,它适用于1个id输入,但不确定如何在同一时间为多个id做它,以便它将获得每个ID的最大周期和max-6,因为每个ID有不同的最大周期。

代码语言:javascript
复制
    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个月的值具有不同的结束日期,因此它们可能不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 21:58:03

您可以使用聚合查询进行join,该查询一次计算所有键的最大周期:

代码语言:javascript
复制
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

但是窗口函数在这里可能更有效:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64029550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档