我有一个包含以下列的表,用于存储fileNumber和version。
id, fileNumber, version, approved (0/1) .
可以有相同fileNumber的多个版本。如果批准了特定的fileNumber和版本,则批准的列值将为1。
我需要编写一个有效的查询来找出给定fileNumber的max(版本)。
规则(按优先顺序)是:
1)如果有批准的版本,获得批准的最大(版本)= 1
2)如果没有批准的版本,只需获取max(版本)
数据库是oracle。
我会这样做:
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
的表现印象深刻。
通过排序和选择顶行可能最简单:
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
你可以这样做:
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
)