Sql 基于字段值限制查询结果

Sql 基于字段值限制查询结果,sql,postgresql,Sql,Postgresql,我有一个具有休闲结构的表帐户: | agg_type | agg_id | sequence | payload | is_snapshot | timestamp | | "account" | "agg_1" | 1 | "..." | false | ... | | "account" | "agg_1" | 2 | ".

我有一个具有休闲结构的表帐户:

| 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

我认为这个问题会是这样的

从帐户中选择* 哪里 agg_type='account' 和agg_id='agg_1' 按顺序排序ASC 限度 是那个???我不太确定如何实施的部分

Obs:

如果有帮助的话,我正在使用Postgres。 agg_类型、agg_id、序列组合是主键。
简单地说,我们可以检索序列大于或等于最高序列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行,我只想让2000行符合这1000行所规定的标准,这1000行最清楚地被认为是用AS连接在一起的数据块 挑选* ,按a.agg\u类型划分的行数,按a.SEQUENCE DESC rnk划分的a.agg\u id顺序 来自帐户a
从a.rnk中选择*窗口函数可以为所有agg_类型、agg_id组合使用一种排序:

with mark as (
  select *, 
         bool_or(is_snapshot) over w as trail_true
    from account
  window w as (partition by agg_type, agg_id 
                   order by sequence
            rows between 1 following
                     and unbounded following)
)
select *
  from mark
 where not coalesce(trail_true, false)
 order by agg_type, agg_id, sequence

您是为所有AGG还是每次为特定AGG执行此操作?每次为每个AGG执行此操作。