這裏有一種方法:
WITH your_table AS (SELECT 112 col1, 'Liq' col2, 'Tall' col3, 1 pk FROM dual UNION ALL
SELECT 112 col1, 'asf' col2, 'Small' col3, 2 pk FROM dual UNION ALL
SELECT 113 col1, 'Asf' col2, 'S1' col3, 3 pk FROM dual UNION ALL
SELECT 113 col1, 'fgs' col2, 'S2' col3, 4 pk FROM dual UNION ALL
SELECT 115 col1, 'Mid' col2, 'F1' col3, 5 pk FROM dual)
-- end of data setup; see SQL below
SELECT col1,
col2,
col3,
pk
FROM (SELECT col1,
col2,
col3,
pk,
row_number() OVER (PARTITION BY col1 ORDER BY CASE WHEN UPPER(col2) = 'LIQ' THEN 1 ELSE 2 END, col2 ASC) rn
FROM your_table)
WHERE rn = 1
ORDER BY col1;
COL1 COL2 COL3 PK
---------- ---- ----- ----------
112 Liq Tall 1
113 Asf S1 3
115 Mid F1 5
這是通過分配各行的行號對每個col1值進行排序,並首先排序*通過檢查col2的大寫值是否爲「LIQ」並給出最低數字(在我的示例中爲1)以及其他所有數字爲高數字(在本例中爲2)和然後 按col2升序排序。
如果您需要不同的行排序,您需要修改ROW_NUMBER()分析函數中的ORDER BY語句的第二部分。
最後,一旦行被標記了行號,就可以通過選擇標有「1」的行來過濾它們。
*此時您可以使用Neville的解決方案而不是對優先級值進行硬編碼 - 即有一個包含優先級值的單獨表格,並將其與表格結合使用,然後使用優先級值ROW_NUMBER()函數。
這是針對Oracle還是針對MySQL?另外,「fletch」是什麼意思?你的意思是「取」?看起來你是在爲每個不同的col1選擇了1行之後 - 你提到它取決於col2的值,但是你提到的邏輯(「LIQ」=最高優先級)並不能解釋你爲什麼得到pk = 3和5行返回。請問實際的邏輯是什麼? (我的直覺是你想調查ROW_NUMBER()分析函數爲每個組分配行號,然後過濾行號爲1的集合。) – Boneist
Oracle和是一個分區行...如果「LIQ 「是他們當時只優先考慮其他方面沒有優先權......並且在col2的第3列的基礎上fletch第一個城鎮,它不依賴row_number我認爲...但我仍然不知道 –
以及怎麼做我們知道基於col2的「第一個」是什麼?它是否按字母順序? – Boneist