基于条件的每组最大值

时间:2017-12-21 17:11:20

标签: sql oracle

我有一个包含以下列的表,用于存储fileNumber和version。

id, fileNumber, version, approved (0/1) .

同一个fileNumber可以有多个版本。如果批准了特定的fileNumber和版本,则批准的列值将为1.

我需要编写一个有效的查询来找出给定fileNumber的最大值(版本)。

规则(按优先顺序排列)是:

1)如果有批准的版本,请获得批准的最大(版本)= 1

2)如果没有批准版本,只需获取max(版本)

数据库是oracle。

3 个答案:

答案 0 :(得分:1)

通过排序和选择顶行可能最简单:

 select * from(
  SELECT
   *
  FROM
   table
  WHERE 
   filenumber = x
  ORDER BY
   approved DESC, version DESC
 ) a
 WHERE rownum = 1

oracle(12c +)的更高版本不需要子查询:

  SELECT
   *
  FROM
   table
  WHERE 
   filenumber = x
  ORDER BY
   approved DESC, version DESC
  OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

答案 1 :(得分:1)

我会这样做:

select filenumber,
       coalesce(max(case when approved = 1 then version end),
                max(version)
               ) as your_max_version
from t
group by filenumber;

在Oracle中,您也可以使用keep

执行此操作
select filenumber,
       max(version) keep (dense_rank first order by approved desc, version desc) as your_max_version
from t
group by filenumber;

我推测第一个版本会快一点,但我对keep的性能印象通常很好。

答案 2 :(得分:0)

您可以执行以下操作:

SELECT fileNumber,
       COALESCE(max_approved, max_overall)
FROM (
    SELECT fileNumber, 
           MAX(CASE WHEN approved = 1 THEN version ELSE NULL END) as max_approved,
           MAX(version) as max_overall
    FROM table
    GROUP BY fileNumber
)