这是问题的延续: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 :(得分: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值)。
我不确定正确的分区键是什么。您可以放入所有列,但较小的子集可能就足够了。