2016-06-13 22 views
1

我有這樣我的存儲proedure的某些部分的輸出:SQL服務器:拿到列2和欄3值的最大值必須是1

col1  col2 col3 col4 
-------------------------- 
2016-05-05 1 2  2 
2016-05-05 1 3  32 
2016-05-12 2 1  11 
2016-05-12 3 1  31 

現在我需要的結果基於這種情況

col2 = 1 and col3 = max or col3 = 1 
and col2 = max 

最終的結果應該是

col1  col2 col3 col4 
------------------------- 
2016-05-05 1 3  32 
2016-05-12 3 1  31 

回答

0

不知道如果多數民衆贊成在最有效的方式,但你可以用ROW_NUMBER()

SELECT * FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.col1 ORDER BY t.col3 DESC) as rnk, 
    WHERE t.col2 = 1 
    UNION ALL 
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.col1 ORDER BY t.col2 DESC) as rnk, 
    WHERE t.col3 = 1) tt 
WHERE rnk = 1 

這會給你的所有記錄與

(col2=1 and col3=max) or (col3=1 and col2=max) 
0

這是一個有點棘手。您的數據沒有歧義,例如col4中的重複最大值或col2col3中的「1」值。

以下是邏輯的在你的問題的直接翻譯:

select t.* 
from t 
where t.col4 = (select max(t2.col4) 
       from t t2 
       where t2.col1 = t.col1 and (t2.col2 = 1 or t2.col3 = 1) 
       ); 
+0

他不關心'col4','2 = 1個+ MAX(3)'或'3 = 1 + max(2)' – sagi

0

試試這個。請注意,如果有多個相同的max值,那麼您需要所有這些輸出中的值。即使col1col2col3不同步,它也適用於所有情況。

我首先找到col2col3的最高值,並將它們賦值爲1。然後在外部查詢中,我正在使用您的連接條件。爲SQLServer創建的Postgres數據庫演示不可用。

SQLFiddle Demo

select col1,col2,col3,col4 
from 
(
    select t.*, 
    RANK() OVER(ORDER BY col3 DESC) as col3_max, 
    RANK() OVER(ORDER BY col2 DESC) as col2_max 
    from your_table t 
) t1 
where 
(col2=1 and col3_max=1) 
OR 
(col3=1 and col2_max=1) 
+0

如果存在col2 <> 1和col3 <> 1'的記錄,則不起作用。 – sagi

+0

如果col2 <> 1和/或col3 <> 1存在,它將不會滿足where子句,並且會被跳過。我錯過了什麼嗎? – Utsav

+0

行列不一定是正確的,等級'1'不一定與'col3' = 1。 – sagi

0

替代方式:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY iif(col2 = 1, col3, col2) DESC) as r 
    FROM tbl) t 
WHERE r = 1 
相關問題