簡體   English   中英

版本2:如何編寫postgres sql查詢,返回M +某個列的不同值,返回M +未知的總記錄?

[英]Version 2: How can I write a postgres sql query that returns M distinct values of a certain column with M + unknown overall records returned?

這是我之前發布的稍微更難的版本。 我不想編輯原文來破壞我當時的問題的完美答案。

假設一個名為tau的表。

tau:
A | B | C
----------    
2 - 1 - red
3 - 1 - rod
4 - 1 - rope
6 - 5 - red
7 - 5 - rap
8 - 5 - rod
9 - 10 -rod
11- 10 -road
12- 13 -rud

A列是主鍵。 它將是獨一無二的。 B列是外鍵。 在我的數據庫中,沒有整數鍵在表之間是相同的。 C列不是關鍵。

這個表會有很多行。 還有許多其他列,例如列C,它們是為搜索索引的。

我想從B列得到M個不同的值。讓我們說M = 2

重要的是,我在表達式中使用了列B(它也被索引了!)來確定返回哪個B.

通常,我會去

select distinct B From tau Where C like 'r_d' AND B < 13 Order By B Desc Limit 2

我明白了

B
-----
10
5

這就是現在的現狀。 但我想升級到一個新的場景:

當滿足BC上的表達式並將記錄添加到結果堆(C如'r_d'和B <13)時,我想返回A列和B列, 同時保持2的限制最多不同的B列值。

另一個重要條件是解決方案必須適用於where子句中的表達式,該表達式對於可能不同的C值返回true。

看哪,我想要的結果。

A | B
------
9 - 10
8 - 5
6 - 5

麻煩的是,返回的記錄的實際限制可能大於M,或者示例中為2。 我真的不關心有多少記錄通過,只要只有M個不同的B值。如何在Postgresql中編寫查詢來完成此操作?

DENSE_RANK應該做你需要的。 這是SQL小提琴 將你的M放入WHERE R.rnk <= 2而不是2

而不是從B開始M不同的值並試圖弄清楚如何將A列中A缺失值添加到最終結果中,我正在考慮另一方面的這個問題。 我們有一些搜索條件將整個表限制為某些中間結果集:

SELECT *
FROM tau
WHERE C LIKE 'r_d' AND B < 13

此中間結果集包含表中的所有列,但尚未匯總任何內容。 我們只需要進一步過濾這個集合,只留下B列的M不同值。 DENSE_RANK為每組B值分配一個數字(無間隙),因此我們可以在最終過濾器中使用它。

SELECT
    A, B
FROM
    (
        SELECT
            A
            ,B
            ,C
            ,DENSE_RANK() OVER(ORDER BY B DESC) AS rnk
        FROM tau
        WHERE C LIKE 'r_d' AND B < 13
    ) AS R
WHERE R.rnk <= 2
ORDER BY B DESC, A DESC;

結果集

A    B
9    10
8    5
6    5

使用LATERAL JOIN的第二個變體

SQL小提琴兼有兩種變體。 在第二個變體中,我們首先找到M不同的B值。 然后,對於每個找到的值,我們使用針對此B值的額外過濾器運行主查詢。 如果現在有成千上萬的不同值的B ,然后過濾到特定的值應該是有效的,只要是在索引B 如果有數百萬行,但B的總不同值的數量很小,則應該很慢。

WITH
CTE
AS
(
    select distinct B 
    From tau 
    Where C like 'r_d' AND B < 13 
    Order By B Desc 
    Limit 2
)
SELECT
  T.A, T.B, T.C
FROM
  CTE
  INNER JOIN LATERAL
  (
      SELECT tau.A, tau.B, tau.C
      FROM tau
      WHERE tau.B = CTE.B AND tau.C like 'r_d' AND tau.B < 13 
  ) AS T ON true
ORDER BY T.B DESC, T.A DESC;

暫無
暫無

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

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