2016-12-07 77 views
0

我在嘗試編寫一個查詢來總結一個表。創建一個基於標誌的過濾器視圖

我想知道最有效的方法是。

我的數據被組織爲例如:

ID | Value | Flag. 
---------------------- 
1 | 45 | 0 
1 | 52 | 1 
2 | 35 | 0 
3 | 50 | 0 

如果ID重複兩次,比我想利用其中標誌= 1,否則我想利用零

我嘗試的值:

Select ID, 
case when (select count(*) from table a2 where a2.id = a.id) = 2 THEN 
    1 
ELSE 
    0 
END flag, 
case when (select count(*) from table a2 where a2.id = a.id) = 2 THEN 
    (select a2.value from table a2 where a2.id = a.id) 
ELSE 
    a.value 
END value 
from table a 

^^這將導致

1 | 52 | 1 
1 | 52 | 1 
2 | 35 | 0 
3 | 50 | 0 

我仍然需要擺脫重複(即。第一個或第二個條目需要被刪除,因爲現在我只需要每個ID一個值),但是在我進一步討論之前,我已經意識到這對於效率來說可能不是最理想的。

+1

表中的行不是***「排序」 - 除非您使用'order by'指定順序,否則表格或查詢中不存在「第一行」。所以你需要一些條件,讓你在你的例子中選擇52比45。 –

+0

你真的能做'case when(從表a2選擇count(*)where a2.id = a.id)= 2然後 (從表中選擇a2.value,其中a2.id = a.id)'this? a2不屬於'then'部分 – GurV

+0

@GurwinderSingh我的錯誤,那是一個錯字,是的,我在plsql上試過它,然後發佈在這裏 –

回答

1

您可以使用窗口功能來做到這一點。

但是,表中的行未按任何方式排序。有「第一排」(或第二或最後)除非您使用order by

如果如沒有這樣的事要挑選每個ID最高value(或者你不真正關心它的價值你選擇),您可以使用:

select id, 
     value 
from (
    select id, 
     value 
     row_number() over (partition by id order by value desc) as rn 
    from the_table 
) 
where rn = 1; 
+0

如果flag = 1比我取這個值,否則我會採取數據庫中的任何內容。我以前從來沒有聽說過分區或窗口,所以你給了我一個人看看。謝謝。 –

+1

如果該標誌存在於基表中或作爲先前處理的結果,則ROW_NUMBER()調用中的ORDER BY應該是ORDER BY FLAG。 – mathguy

+0

@a_horse_with_no_name請參閱:P – GurV

0

首先,從@a_horse_with_no_name複製。

其次,分區排序需要基於flag而不是value,如問題中所述。但是,如果存在多行具有相同ID和標誌的行,則需要決定應該選擇哪個行,可以使用order by flag desc, value desc而不是分區中的max值,具體取決於您的需要。

select id, 
     value, 
     flag 
from (
    select id, 
     value, 
     flag, 
     row_number() over (partition by id order by flag desc) rn 
    from my_table 
) 
where rn = 1; 
+0

「flag」列是根據重複項評估的*,表中沒有這樣的列。 –

+0

@a_horse_with_no_name它是。看到這個問題。 *如果一個ID重複兩次,比我想取的標誌= 1 *的值和樣本數據 – GurV

+0

它不是:'case when .. END flag' - 它是使用CASE表達式計算的 –

相關問題