簡體   English   中英

根據字段值限制查詢結果

[英]Limit query result based on field value

我有一個具有休閑結構的表account

| 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)。

我認為查詢將 go 類似於

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 行”最清楚地被認為是連接在一起的數據塊

WITH a AS ( SELECT *,row_number() over(partition BY a.agg_type,a.agg_id ORDER BY a."SEQUENCE" DESC) rnk FROM account a ) SELECT * FROM a WHERE a.rnk <= 2;

一個 window function 可以為所有(agg_type, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM