【问题标题】:Select multiple rows with highest rank in mysql选择mysql中排名最高的多行
【发布时间】:2020-08-12 10:59:27
【问题描述】:

我正在使用 MySQL。

从这两个表中,我需要选择每个床位分配的护士人数最多的所有房间。如果有领带,这可以只有一个房间或多个房间。

表分配

+-------+----------+ |护士 |房间 | +-------+----------+ |911923 | 1 | |916923 | 1 | |931923 | 1 | |931926 | 1 | |931927 | 4 | |931928 | 4 | +-------+----------+

餐桌室

+--------+--------+ |号码 |尺寸 | +--------+--------+ | 1 | 2 | | 4 | 1 | +-------+----------+

我正在尝试选择排名最高的行,但限制 1 仅限制一个值,在此示例中,两个房间的排名相同。如果多行具有相同的排名,如何选择所有排名最高的行?

SELECT ROOM.number,
    (SELECT COUNT(*) FROM ALLOCATION
     WHERE ALLOCATION.room = ROOM.number) / ROOM.size AS nurses_per_bed, 
     DENSE_RANK() OVER (ORDER BY nurses_per_bed DESC) AS SEQ

FROM ROOM
LIMIT 1

【问题讨论】:

  • 您的查询问题:您不能创建列别名并在同一个选择子句中使用此别名;您需要为此执行步骤(主查询和子查询)。 LIMIT 没有 ORDER BY 任意选择行。 MySQL 的 LIMIT 没有 ties 子句(您已经注意到了),但 DENSE_RANK 为您提供了您可以简单地在 WHERE 子句中限制的等级。所以,确实想做你已经在做的事情,但要一步一步地去做。请参阅我对此的回答。

标签: mysql sql ranking


【解决方案1】:

一步一步:

  1. 汇总每个房间的分配,以获得房间的护士人数。
  2. 加入房间和护士人数(即分配汇总结果)。
  3. 按比率对结果行进行排名。
  4. 仅显示排名第一的行。

查询:

select room, nurses, ratio
from
(
  select
    r.room,
    a.nurses,
    a.nurses / r.size as ratio,
    dense_rank() over (order by a.nurses / r.size) as rnk
  from room r
  join
  (
    select number as room, count(*) as nurses
    from allocation
    group by number
  ) a on a.room = r.room
) ranked
where rnk = 1
order by room;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多