首页 > 解决方案 > oracle - group by - 无聚合

问题描述

我有一个 oracle 表,其中 ref_id 是标志字段,是数据类型,ORN 是每个 ref_id 中的数据顺序:

ref_id   data    ORN   flag
  1       100     0     0
  1       200     1     0
  1       300     2     0
  1       400     3     0
  1       110     0     1
  1       210     1     1
  1       150     0     2
  1       250     1     2
  1       350     2     2
  1       450     3     2
  2       500     0     0
  2       600     1     0
  2       700     2     0
  2       800     3     0
  2       120     0     1
  2       220     1     1
  2       320     1     1
  2       420     1     1
  2       170     0     2
  2       270     1     2
  2       370     2     2
  2       470     3     2

我需要以某种方式对数据进行分组,以便为​​每个 ref_id 获取标志 0 中的最后一个数据和标志 2 中的最后一个数据

所以新表将是这样的:

ref_id    data_1    data_2
  1        400       450
  2        800       470

任何提示如何在不使用循环的情况下完成此操作?

标签: sqloraclegroup-byanalytic-functions

解决方案


您可以按如下方式使用分析功能和分组依据:

SELECT REF_ID, 
       MAX(CASE WHEN FLAG = 0 THEN DATA END) AS DATA_0,
       MAX(CASE WHEN FLAG = 2 THEN DATA END) AS DATA_2
FROM
(
  SELECT REF_ID, DATA, ORN, FLAG,
         ROW_NUMBER() OVER (PARTITION BY REF_ID, FLAG ORDER BY ORN DESC) AS RN
  FROM YOUR_TABLE 
  WHERE FLAG IN (0,2)
)
WHERE RN = 1
GROUP BY REF_ID

推荐阅读