根据列值选择具有优先级的查询

时间:2014-01-28 13:06:32

标签: sql oracle11g

这是问题的延续: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”值的两行结果相同的结果集。谁能指出如何在这里构建分析函数?

也欢迎任何其他工作方法。 提前谢谢。

1 个答案:

答案 0 :(得分: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值)。

我不确定正确的分区键是什么。您可以放入所有列,但较小的子集可能就足够了。