根据group by-Oracle折叠结果集

时间:2014-11-01 03:38:43

标签: sql oracle oracle11g

在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.

我很感激一些解决方案,可以在单个查询中获得所需的输出。

1 个答案:

答案 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

See a SQLFiddle here

我怀疑你需要正确的索引,如果这些是大数据集的话。