2014-01-28 140 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