【问题标题】:SQL select row(s) with max value calculated from different tablesSQL选择具有从不同表计算的最大值的行
【发布时间】:2020-04-21 13:47:40
【问题描述】:

我有以下两张表: 1. 两列护士和房间的分配 2. 两列房间的数量和大小(床位数)

分配

+------+--------+<br/>
| nurse |  room   |<br/>
+------+---------+<br/>
|911923 |    1    |<br/>
|916923 |    3    |<br/>
|931923 |    1    |<br/>
|931926 |    3    |<br/>
|931927 |    4    |<br/>
|931928 |    4    |<br/>

房间

+-------+--------+<br/>
| number |  size   |<br/>
+-------+--------+<br/>
|    1   |    10   |<br/>
|    2   |    12   |<br/>
|    3   |    1    |<br/>
|    4   |    1    |<br/>
|    5   |    1    |<br/>

我需要确定每张床位分配的护士人数最多的所有房间。如果有领带,这可以只有一个房间或多个房间。

结果应显示房间号,每个房间分配的护士人数最多。

不允许使用 JOIN 操作。我想我需要在将 COUNT(nurse) 除以大小后选择最大值,然后选择与该值对应的房间。 但是,当有两张桌子时,我该怎么做呢?

【问题讨论】:

  • 同时指定预期结果。
  • 用您正在使用的数据库标记您的问题。您还应该尝试解决问题并解释您不理解的概念。

标签: sql


【解决方案1】:

如果您不能使用JOIN,您将使用相关子查询。要整理房间,请使用:

select r.*,
        (select count(*) from allocation a where a.room = r.number) / r.size as nurses_per_bed
from room r
order by nurses_per_bed desc;

如何获得最大值取决于数据库。最规范的方法是使用带有子查询的rank(),但也有其他方法。

【讨论】:

    【解决方案2】:

    您可以使用窗口功能:

    select room, no_nurse
    from (select room, count(*) as no_nurse,
                 dense_rank() over (order by count(*) desc) as seq
          from allocation a
          group by room
         ) r
    where seq = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2017-07-31
      • 2011-02-20
      相关资源
      最近更新 更多