我有一个包含以下列的表,用于存储fileNumber和version。
id, fileNumber, version, approved (0/1) .
同一个fileNumber可以有多个版本。如果批准了特定的fileNumber和版本,则批准的列值将为1.
我需要编写一个有效的查询来找出给定fileNumber的最大值(版本)。
规则(按优先顺序排列)是:
1)如果有批准的版本,请获得批准的最大(版本)= 1
2)如果没有批准版本,只需获取max(版本)
数据库是oracle。
答案 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
)