2017-04-04 47 views
-1

我有4列取如下所示和第一列是主鍵,優先處理的行通過考慮Oracle中的列中的值

Col1 Col2 Col3 Pk 
---- ---- ------ -- 
112 Liq Tall 1 
112 asf Small 2 
113 Asf S1  3 
113 fgs S2  4 
115 Mid F1  5 

在這裏,我需要陳偉偉取決於在列中的值的行2,而不添加任何新的列。

如果「LIQ」在那裏,那麼它就是第一優先。所有其他人都將有正常的優先權,我們將其作爲先到先得的方式。

我們得到的輸出,如:

Col1 Col2 Col3 Pk 
---- ---- ------ -- 
112 Liq Tall 1 
113 Asf S1  3 
115 Mid F1  5 
+1

這是針對Oracle還是針對MySQL?另外,「fletch」是什麼意思?你的意思是「取」?看起來你是在爲每個不同的col1選擇了1行之後 - 你提到它取決於col2的值,但是你提到的邏輯(「LIQ」=最高優先級)並不能解釋你爲什麼得到pk = 3和5行返回。請問實際的邏輯是什麼? (我的直覺是你想調查ROW_NUMBER()分析函數爲每個組分配行號,然後過濾行號爲1的集合。) – Boneist

+0

Oracle和是一個分區行...如果「LIQ 「是他們當時只優先考慮其他方面沒有優先權......並且在col2的第3列的基礎上fletch第一個城鎮,它不依賴row_number我認爲...但我仍然不知道 –

+0

以及怎麼做我們知道基於col2的「第一個」是什麼?它是否按字母順序? – Boneist

回答

0

這裏有一種方法:

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()函數。

0

我沒有訪問SQL數據庫,現在來測試這個權利,但我通常解決這個問題的方法是創建一個「優先級」表。

priority_term  priority_weighting 
------------------------------------- 
Liq        10 

然後,您可以通過priority_weighting使用外連接,有序,是這樣的:

select Col1, 
     Col2, 
     Col3, 
     Pk, 
     isnull(priority_weigthing, -1) 
from my_table mt 
outer join prioritization p 
    on mt.col2 = p.priority_term 
order by p.priority_weighting desc