web-dev-qa-db-ja.com

条件に基づいてSQLのレコードを絞り込む方法

 Customer   Rank      Joining_date       salary
    A         2        2017-10-12         500
    A         1        2017-10-10         800     
    A         1        2017-10-20         400
    B         2        2017-05-20         200
    B         2        2017-05-15         100
    c         3        2017-06-10         600
    c         4        2017-06-05         600

ロジック:特定の顧客向け

ランクが1の場合、ランク1のすべてのレコードを保持し、残りを削除します

顧客が異なるランクのレコードを持っている場合は、最新のランクに基づいてレコードを選択し(ランクの説明で並べ替え)、他のレコードを削除します

顧客が同じランク(1以外)のレコードを持っている場合は、最低給与に基づいてレコードを選択します(給与昇順)**

期待される結果

 Customer   Rank      Joining_date       salary
    A         1        2017-10-10         800     
    A         1        2017-10-20         400
    B         2        2017-05-15         100
    c         4        2017-06-05         600
2
user8545255

ランク1の顧客と他の顧客の動作は異なるため、異なるクエリを使用するだけです。最後の2つの論理条件は、顧客ごとの単純なORDERBYで計算できます。その順序を行全体に関連付けるには、ウィンドウ関数が必要です。

WITH Rank1Customers AS (
  SELECT DISTINCT Customer
  FROM MyTable
  WHERE Rank = 1
)

SELECT Customer, Rank, Joining_date, Salary
FROM MyTable
WHERE Customer IN (TABLE Rank1Customers)
  AND Rank = 1

UNION ALL

SELECT Customer, Rank, Joining_date, Salary
FROM (SELECT *,
             row_number() OVER (PARTITION BY Customer
                                ORDER BY Rank DESC, Salary ASC) AS OrderNr
      FROM MyTable
      WHERE Customer NOT IN (TABLE Rank1Customers)
     ) AS _
WHERE OrderNr = 1;

SQLフィドル

1
CL.