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
ランク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フィドル )