SQL group by query - 选择优先级行

时间:2017-03-14 10:39:13

标签: sql oracle

我在Oracle数据库工作,我需要为下面的表创建查询(查询结果)。

CUSTOMER_REFENRECE LQ   UN   SPECIAL INSTRUCTIONS
------------------ ---- ---- --------------------------------
FI020098           null null Not Restricted as per ADR SP 375
FI020098           HZ   1219 HZ UN1219
FI020098           LQ   1219 UN1219
FI020097           null null null
FI020097           LQ   1219 UN1219

我需要每CUSTOMER_REFERENCE只获得一行才能:

HZ> LQ> NULL

如果有一个HZ,那么只返回HZ行(跳过null)

FI020098 - HZ- 1219- HZ UN1219

如果没有任何HZ和至少一个LQ,请返回LQ行

FI020097 - LQ - 1219 - UN1219

Table

1 个答案:

答案 0 :(得分:0)

使用ROW_NUMBER()分析函数,使用LQ(或DECODE())按照排序重要性的顺序将CASE值映射到数字:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY customer_reference
           ORDER BY DECODE( LQ, 'HZ', 1, 'LQ', 2, 3 ) ASC
         ) AS rn
  FROM   table_name t
)
WHERE  rn = 1;