我的数据库中有一个表,其中包含某些应用程序的配置设置以及这些配置的版本:
app_id | config | version
--------------------------
app1 | conf1v1 | 1
app2 | conf2v1 | 1
app1 | conf1v2 | 2
我需要为每个应用程序获取最新配置(具有最大版本号的配置)。我使用这样的查询:
select c.app_id, c.config, c.version
from config c
where
c.version=(select max(c2.version) from config c2 where c2.app_id = c.app_id)
但似乎效率低下。我想知道,有更有效的方法来完成这项任务吗?
答案 0 :(得分:4)
您可以使用分析功能。这将至少更有效率,因为它避免了两次击中表。
SELECT app_id, config, version
FROM (SELECT app_id,
config,
version,
row_number() over (partition by app_id order by version desc) rnk
FROM config)
WHERE rnk = 1
答案 1 :(得分:1)
将CTE与ROW_NUMBER()组合将允许对表进行单个解析(如果可用则使用索引,以进一步减少读取)......
WITH
reversioned_config
AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY app_id ORDER BY version DESC) as descending_version
FROM
config
)
SELECT
app_id,
config,
version
FROM
reversioned_config
WHERE
descending_version = 1
答案 2 :(得分:0)
怎么样?
select app_id, config, MAX(version) version from config
group by app_id, config