postgres查询的想法

Idea for postgres query

我有一个 postgres 查询,需要从每个 ID 活跃的最后一个月开始的定义的 6 个月内获取一些事实(我在 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 个月的值具有不同的结束日期,因此它们可能不同。

您可以 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

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

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