在txn_ctry表中输入记录:
txn_id ben_code ben_ctry ben_score orig_code orig_ctry orig_score
1 US USA 1 ZZ Unknown -1
2 CA Canada 1 PR Portugal 2.3
2 DE Germany 1.5 MX Mexico 8.5
2 FR France 2.5 ZZ Unknown -1
3 AA Anon -2 US USA 1
3 CA Canada 1 AA Anon -2
3 US USA 1 AA Anon -2
需要输出:
txn_id ben_code ben_score orig_code orig_score
1 US 1 ZZ -1
2 FR 2.5 MX 8.5
3 CA 1 US 1
要求是找到每个txn_id的最高ben_score和orig_score,如输出中所示。
如示例输入数据所示(每个txn_id可以存在更多行,但这只是一个数据片段),txn_id = 1只有一行,因此它是直接的。
Txn_id = 2有3行,最高ben_score用于ben_code = FR,最高orig_score用于orig_code = MX
如果txnid中的代码之间存在联系,则需要选择具有升序字母顺序的代码,就像txn_id = 3的情况一样,其中US和CA的ben_code值具有相同的高分1,但应根据相应的ctry列(ben_ctry和orig_ctry)的字母顺序挑选CA.
我很感激一些解决方案,可以在单个查询中获得所需的输出。
答案 0 :(得分:0)
此查询将实现您的要求:
with enhanced_data as (
select
data.txn_id,
first_value(ben_code ) over (
partition by txn_id order by ben_score desc, ben_code asc) first_ben_code,
first_value(ben_score ) over (
partition by txn_id order by ben_score desc, ben_code asc) first_ben_score,
first_value(orig_code ) over (
partition by txn_id order by orig_score desc, orig_code asc) first_orig_code,
first_value(orig_score) over (
partition by txn_id order by orig_score desc, orig_code asc) first_orig_score
from
data
)
select distinct
txn_id,
first_ben_code,
first_ben_score,
first_orig_code,
first_orig_score
from enhanced_data
order by txn_id
我怀疑你需要正确的索引,如果这些是大数据集的话。