gpt4 book ai didi

sql - 获得最大值的行的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-04 10:11:14 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Fetch the row which has the Max value for a column

(35 个回答)



GROUP BY with MAX(DATE) [duplicate]

(6 个回答)



Oracle SQL query: Retrieve latest values per group based on time [duplicate]

(2 个回答)



Select First Row of Every Group in sql [duplicate]

(2 个回答)



Return row with the max value of one column per group [duplicate]

(3 个回答)


去年关闭。




想象一下,我们有一家漂亮的酒店。这家酒店的数据库只有一张表:

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 万间客房 .所以我必须加入两个大 table
  • 我有点害怕参加约会。感觉可能出问题了。顺便说一下,Check_in 栏也有时间。这使它变得更加困惑。

  • 我想知道我的担忧是否相关?

    最佳答案

    最方便的大概是row_number() :

    select r.*
    from (select r.*,
    row_number() over (partition by room order by checkin dec) as seqnum
    from rooms r
    ) r
    where seqnum = 1;

    索引位于 (room, checkin) ,这应该也有不错的表现。

    有时相关子查询效果更好:
    select r.*
    from rooms r
    where r.checkin = (select max(r2.checkin)
    from rooms r2
    where r2.room = r.room
    );

    Oracle 有一个很好的优化器,所以我不确定哪个更适合您的情况。

    关于sql - 获得最大值的行的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61325573/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com