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
我有一个 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