Oracle:每个组的 SUM 的 MAX
Oracle: MAX of SUM of Each Group
我的场景是使用子查询显示每个酒店分店维护成本最高的酒店房间。我有三个单独的表:branch
、room
和 maintenance
.
Table branch
id NUMBER(3) PRIMARY KEY
location VARCHAR2(20)
Table room
id NUMBER(3) PRIMARY KEY
room_number CHAR(4)
branch_id NUMBER(3)
Table maintenance
id NUMBER(3) PRIMARY KEY
room_id NUMBER(3)
cost NUMBER(4)
我想要的输出格式为
location | room_number | cost
-------------------------------
| |
| |
| |
我不确定如何 select 添加每个房间的总成本后每个分支的最大值。请指教
您可以使用 window 函数:
select *
from (
select b.location, r.room_number, m.cost,
rank() over(partition by b.id order by m.cost desc) rn
from branch b
inner join room r on r.branch_id = b.id
inner join maintenance m on m.room_id = r.id
) t
where rn = 1
如果一个房间可能有多次维护,那么我们需要聚合:
select *
from (
select b.location, r.room_number, sum(m.cost) as cost,
rank() over(partition by b.id order by sum(m.cost) desc) rn
from branch b
inner join room r on r.branch_id = b.id
inner join maintenance m on m.room_id = r.id
group by b.id, b.location, r.room_number
) t
where rn = 1
您可以使用 ROW_NUMBER()
分析函数以及连接这些表
SELECT location, room_number, cost
FROM (SELECT b.location,
r.room_number,
m.cost,
ROW_NUMBER() OVER(PARTITION BY r.branch_id ORDER BY m.cost DESC) AS rn
FROM branch b
JOIN room r
ON r.branch_id = b.id
JOIN maintenance m
ON m.room_id = r.id)
WHERE rn = 1
P.S。如果关系(成本的相等值)很重要(即使生成额外行的最大成本值没有问题也应该包括在内),那么您可以将 ROW_NUMBER()
替换为 DENSE_RANK()
我的场景是使用子查询显示每个酒店分店维护成本最高的酒店房间。我有三个单独的表:branch
、room
和 maintenance
.
Table branch
id NUMBER(3) PRIMARY KEY
location VARCHAR2(20)
Table room
id NUMBER(3) PRIMARY KEY
room_number CHAR(4)
branch_id NUMBER(3)
Table maintenance
id NUMBER(3) PRIMARY KEY
room_id NUMBER(3)
cost NUMBER(4)
我想要的输出格式为
location | room_number | cost
-------------------------------
| |
| |
| |
我不确定如何 select 添加每个房间的总成本后每个分支的最大值。请指教
您可以使用 window 函数:
select *
from (
select b.location, r.room_number, m.cost,
rank() over(partition by b.id order by m.cost desc) rn
from branch b
inner join room r on r.branch_id = b.id
inner join maintenance m on m.room_id = r.id
) t
where rn = 1
如果一个房间可能有多次维护,那么我们需要聚合:
select *
from (
select b.location, r.room_number, sum(m.cost) as cost,
rank() over(partition by b.id order by sum(m.cost) desc) rn
from branch b
inner join room r on r.branch_id = b.id
inner join maintenance m on m.room_id = r.id
group by b.id, b.location, r.room_number
) t
where rn = 1
您可以使用 ROW_NUMBER()
分析函数以及连接这些表
SELECT location, room_number, cost
FROM (SELECT b.location,
r.room_number,
m.cost,
ROW_NUMBER() OVER(PARTITION BY r.branch_id ORDER BY m.cost DESC) AS rn
FROM branch b
JOIN room r
ON r.branch_id = b.id
JOIN maintenance m
ON m.room_id = r.id)
WHERE rn = 1
P.S。如果关系(成本的相等值)很重要(即使生成额外行的最大成本值没有问题也应该包括在内),那么您可以将 ROW_NUMBER()
替换为 DENSE_RANK()