Sql postgres查询的思路

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 =

我有一个postgres查询,需要在定义的6个月内为每个ID获取一些事实,从最后一个月开始,它们处于活动状态,我在where子句中使用了2个子查询

我已经完成了下面的查询,该查询适用于1个id输入,但不确定如何同时对多个id进行查询,以便获得每个id的最大周期和最大-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的最后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条件。固定的不过我还是建议使用第二种,我认为它更有效。谢谢!在我发布了关于缺失条件的评论后,我注意到了这一点。工作很有魅力!