2014-01-28 186 views
0

這是問的問題的延續:select query with priority based on column values 我有一個相同的問題,其中我的結果集(這是一個機場的飛行運動報告)是這樣的:選擇查詢值

sl_no term arr org sta ata arr_pax asrc dep dep_pax dsrc std atd 
----- ---- --- ---- --- ----- ----- ----- ----- ---- - ----- ---- --- 
01 D TY123 TTY 00:00 00:05 123 USR II 877 26  LDM 00:45 00:50 
02 D TY123 TTY 00:00 00:05 55 LDM II 877 26  LDM 00:45 00:50 
03 D FY598 TTY 00:00 00:05 123 LDM II 877 32  USR 00:45 00:50 
04 D ZX555 TTY 00:00 00:05 223 LDM II 877 55  LDM 00:45 00:50 
05 D XX645 TTY 00:00 00:05 16 LDM II 877 55  LDM 00:45 00:50 
06 D XX645 TTY 00:00 00:05 16  LDM II 877 65  USR 00:45 00:50 

現在,您可以觀察到,前兩行是相同的,但是列'asrc'('USR'和'LDM')下的值相同。同樣,除了列'dsrc'下的值('USR'和'LDM'),第5行和第6行是相同的。

我的目標結果應該只包含其中一個相同的行,如果存在'USR',包含'LDM'的行將被丟棄。如果'USR'不存在並且'LDM'是唯一存在的,那麼將選擇該行。

鏈接問題的第二個答案建議使用分析函數。我試圖做到這一點,我結束了下面的查詢:

的摘錄:

SELECT term,arr,org,sta,ata,arr_pax,asrc,dep,dep_pax,dsrc,std,atd,Max(dep_pax) KEEP (Dense_Rank first ORDER BY apriority) FROM 
(
Select .....<joins to build the query> 
, CASE dpriority 
    WHEN 'USR' THEN 1 
    WHEN 'LDM' THEN 2 
END AS dpriority 
, CASE dpriority 
    WHEN 'USR' THEN 1 
    WHEN 'LDM' THEN 2 
END AS dpriority FROM 
...... ; 

我還是結束了相同的結果與「USR」和「LDM」值兩排設置。任何人都可以指出如何在這裏構建分析功能?

任何其他工作方法也是受歡迎的。 在此先感謝。

+0

也許HAVING子句是你在這裏失蹤: http://docs.oracle.com/javadb/10.8.1.2/ref/rrefsqlj14854.html – selalerer

回答

0

下面的邏輯應該這樣做:

SELECT term, arr, org, sta, ata, arr_pax, asrc, dep, dep_pax, dsrc, std, atd, 
     Max(dep_pax) KEEP (Dense_Rank first ORDER BY apriority) 
FROM (select t.*, 
      sum(case when dpriority = 'USR' then 1 else 0 end) over (partition by . . .) as NumUSR, 
      sum(case when dpriority = 'LDM' then 1 else 0 end) over (partition by . . .) as NumLDM 
     from t 
    ) t 
WHERE dpriority = 'USR' or NumUSR = 0; 

它計算的「USR」值的數量和「LDM」值數(嚴格來說,後者不是必要的)。邏輯是如果可用,則取「USR」值,如果沒有USR值則取任何值。

我不確定正確的分區鍵是什麼。你可以放入所有的列,儘管更小的子集可能就足夠了。

+0

它的工作。謝謝。對於面臨同樣問題的其他人,Gordon提供的答案中的片段「Max(dep_pax)KEEP(Dense_Rank first order OR apriority)」並不相關。只是想補充一點,以防有人因此而被拋出去... – bijeshn