基于条件的每组最大值

问题描述 投票:0回答:3

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

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

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

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

规则(按优先顺序)是:

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

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

数据库是oracle。

sql oracle
3个回答
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的表现印象深刻。


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

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
)
© www.soinside.com 2019 - 2024. All rights reserved.