什么是获取具有最大值的行的最有效方法? [重复]

问题描述 投票:1回答:1

想象我们有一家美丽的酒店。这家酒店的数据库只有一个表:

room check-in    check_out   other columns...
1    2020-02-04  2020-02-05  ...
1    2020-02-06  2020-02-09  ...
1    2020-04-20  NULL        ...
2    2020-03-29  2020-04-01  ...
2    2020-04-17  2020-04-18  ...

其他列的值]为每个房间选择最后一个登机的最佳和有效的方法是什么(否则我将只使用room, max(check-in)

预期结果是

room check_in   check_out  other columns... 
1    2020-04-20 NULL       ...
2    2020-04-17 2020-04-18 ...

我想到的第一个想法是将该表及其副本加入其中:

WITH last_checkins AS (
    SELECT room, max(check_in) AS last_c
    FROM rooms
    GROUP BY room
)
SELECT *
FROM rooms r
         INNER JOIN last_chekins c
                    ON r.room = c.room
                        AND r.checkin = c.last_c;

我对此想法不满意

  • 似乎有点低效。 这家酒店的3000万间客房。所以我将不得不加入两个大表
  • 我有点怕约会。感觉可能出了点问题。 Check_in列也有时间。这使它更加混乱。
  • 我想知道我的关注点相关吗?

想象我们有一家美丽的酒店。这家酒店的数据库只有一个表:房间登记入住check_out其他列... 1 2020-02-04 2020-02-05 ... 1 2020-02-06 2020-02-09 ... 1。 ..

sql oracle greatest-n-per-group
1个回答
2
投票

最方便的可能是row_number()

© www.soinside.com 2019 - 2024. All rights reserved.