我有一个表帐户
,其结构如下:
| agg_type | agg_id | sequence | payload | is_snapshot | timestamp |
| "account" | "agg_1" | 1 | "..." | false | ... |
| "account" | "agg_1" | 2 | "..." | true | ... |
| "account" | "agg_1" | 3 | "..." | false | ... |
| "account" | "agg_1" | 4 | "..." | false | ... |
| "account" | "agg_1" | 5 | "..." | false | ... |
| "account" | "agg_1" | 6 | "..." | false | ... |
| "account" | "agg_1" | 7 | "..." | true | ... |
| "account" | "agg_1" | 8 | "..." | false | ... |
我需要编写一个查询,该查询将从特定聚合的最新快照开始检索该表中的所有行。例如,在此表中,查询将返回最后两行(序列 7 和 8)。
我认为查询会是这样的
SELECT * FROM account
WHERE
agg_type='account'
AND agg_id='agg_1'
ORDER BY sequence ASC
LIMIT (???);
这是我不太确定如何实现的 (???)
部分。
观察:
- 我正在使用 Postgres,如果它有帮助的话。
- (agg_type、agg_id、sequence)组合是主键。
最佳答案
简单地说,我们可以检索序列大于或等于快照的最高序列 ID 的所有帐户
SELECT * FROM account a
WHERE
a.agg_type='account'
AND a.agg_id='agg_1'
AND a.sequence >=
(SELECT MAX(sequence) FROM account b WHERE a.agg_type = b.agg_type AND a.agg_id = b. agg_id AND b.is_snapshot = true)
如果您想完成所有这些操作,将其写为联接可能会更清楚:
SELECT a.*
FROM
account a
INNER JOIN
(
SELECT
agg_type,
agg_id,
MAX(sequence) as maxseq
FROM account b
GROUP BY agg_type, add_id
) maxes
ON
a.agg_type = maxes.agg_type and
maxes.agg_id = a.max_id and
a.sequence >= maxes.maxseq
这并不是说我们不能用任何一种形式完成任何任务(并且 postgres 内部可能会以相同的方式执行它们),但我一直认为使用连接作为“这里有 10000 行,我只想要满足这 1000 行规定的标准的 2000 行”最清楚地考虑的是连接在一起的数据 block
关于sql - 根据字段值限制查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380725/