簡體   English   中英

SQL查詢以從每個組中選擇一行作為首選項

[英]SQL query to select one row from each group with preference

例如,假設我有一個包含兩列XY的表。 現在,我要從該表中select一些具有以下規則的行:

  1. 將“組”定義為具有與Y列相同值的一組行。
  2. 從一組中僅選擇一行。
  3. 在一個組中,如果其中一行具有X=a ,其中a是預定義的,則從該組中選擇該行。
  4. 在一個組中,如果沒有行具有X=a ,那么可以選擇任何行。

在單個SQL查詢中可以執行哪些操作?

嘗試這個:

SELECT DISTINCT
  t1.Y,
  COALESCE(a2.x, a1.x) 'x'
FROM Tablename t1
LEFT JOIN
(
    SELECT Y, MIN(x) x
    FROM Tablename
    GROUP BY Y
) a1 ON t1.Y = a1.Y
LEFT JOIN
(
    SELECT Y, MIN(x) x
    FROM Tablename
    WHERE x = 'a'
    GROUP BY Y
) a2 ON t1.Y = a2.Y;

SQL小提琴演示

DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE yx
        ( Y INTEGER NOT NULL
        , x CHAR NOT NULL
        , PRIMARY KEY (y,x)
        );
INSERT INTO yx (y,x) VALUES
 (10,'b') ,(10,'d') ,(10,'e' )  -- y==10 does not have an 'a'
,(20,'b') ,(20,'a') ,(20,'d')   -- y==20 does have an 'a'
        ;

        --
        -- using a CTE
        --
WITH    this AS (
        SELECT y,x
        , row_number() OVER (PARTITION by y ORDER BY (x='a') DESC, x ASC) AS rnk
        FROM yx
        )
SELECT this.y,this.x 
FROM this
WHERE this.rnk = 1
        ;

        --
        -- with a subselect instead of a CTE
        --
SELECT this.y,this.x 
FROM (
        SELECT y,x
        , row_number() OVER (PARTITION by y ORDER BY (x='a') DESC, x ASC) AS rnk
        FROM yx
        ) this
WHERE this.rnk = 1
        ;

暫無
暫無

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

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