写一条sql。 求酒店下所有房型的平均价格大于500的所有酒店,按照平均价格倒序,取前第21行到第60行房型Id。 表结构: house_type (房型表) [id (房型ID),hotel_id in (酒店ID),price (房型价格)} 业务背景:酒店与房型的关系是1对多。房型有:大床房、标间、豪华大床房等等。酒店的平均价格是由房型上的价格决定的。
时间: 2024-02-24 16:54:52 浏览: 407
可以使用以下 SQL 语句实现:
```
WITH hotel_avg_price AS (
SELECT hotel_id, AVG(price) AS avg_price
FROM house_type
GROUP BY hotel_id
HAVING AVG(price) > 500
),
hotel_rank AS (
SELECT hotel_id, DENSE_RANK() OVER (ORDER BY avg_price DESC) AS rank
FROM hotel_avg_price
)
SELECT id
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY avg_price DESC) AS row_num
FROM house_type
WHERE hotel_id IN (
SELECT hotel_id
FROM hotel_rank
WHERE rank BETWEEN 21 AND 60
)
) AS house_type_ranked
WHERE row_num BETWEEN 21 AND 60
```
该 SQL 语句首先使用 CTE(公共表达式)计算每个酒店的平均价格,并筛选出平均价格大于 500 的酒店。然后使用 DENSE_RANK 函数计算出酒店的排名。接着在 house_type 表中筛选出属于排名在 21 到 60 之间的酒店的所有房型,并按照平均价格倒序排序。最后使用 ROW_NUMBER 函数对结果进行再次排序,并返回第 21 到 60 行的房型 ID。
阅读全文