oracle - 选择多列上的第一个,第二个和第三个最大数字

时间:2017-04-11 09:40:22

标签: sql oracle top-n

我有这个表结构

CLIENT_ID | QTY_A | QTY_B | QTY_C | QTY_D | QTY_E 
====================================================
1         |     20|     21|     19|   NULL|    30 
----------------------------------------------------
2         |     45|   NULL|     31|     80|    54 
----------------------------------------------------

我正在尝试为wate CLIENT_ID计算第一,第二和第三大值。

我怎样才能做到这一点?分析功能在这里帮不了我吧?我不能只按一栏排序。

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用UNPIVOT将列转换为行,然后使用ROW_NUMBER分析函数对行进行编号:

SELECT client_id,
       type,
       quantity
FROM   (
  SELECT client_id,
         type,
         quantity,
         ROW_NUMBER() OVER ( PARTITION BY client_id ORDER BY quantity DESC ) AS rn
  FROM   table_name
  UNPIVOT ( quantity FOR type IN ( qty_a, qty_b, qty_c, qty_d, qty_e ) )
)
WHERE  rn <= 3