[英]SELECT hotel name with highest number of reservations in each year Oracle sql (Query)
我希望我的 SELECT 返回每年预订次数最多的酒店的名称。 如果有不止一家酒店处于这种情况,则应显示所有这些酒店。 它还应该返回每个酒店的预订数量。
输出应该是这样的:
HOTEL NUMBER_RESERVATIONS
Hotel Paris 189 --year 2017 hotel w/ highest n/reservations
Hotel Bristol 207 --year 2010 hotel w/ highest n/reservations
我有三张表:
CREATE TABLE hotel (
name VARCHAR (20),
CONSTRAINT pk_hotel
PRIMARY KEY (name)
);
CREATE TABLE reservation (
person,
hotel,
year DATE,
CONSTRAINT pk_reservation
PRIMARY KEY (hotel, person),
CONSTRAINT fk_reservation_hotel
FOREIGN KEY (hotel)
REFERENCES hotel(name)
CONSTRAINT fk_reservation_person
FOREIGN KEY (person)
REFERENCES person(pid)
);
CREATE TABLE person (
pid NUMBER (5),
CONSTRAINT pk_person
PRIMARY KEY (pid)
);
您可以汇总以查找每年的预订数量,然后使用RANK
分析函数来获取每年预订最多的酒店:
SELECT hotel,
num_reservations,
year
FROM (
SELECT t.*,
RANK() OVER ( PARTITION BY year ORDER BY num_reservations DESC ) AS rnk
FROM (
SELECT hotel,
COUNT(*) as num_reservations,
EXTRACT( year FROM year ) AS year
FROM reservation
GROUP BY
hotel,
EXTRACT( year FROM year )
) t
)
WHERE rnk = 1;
其中,或样本数据:
CREATE TABLE reservation (
person VARCHAR2(50),
hotel VARCHAR2(50),
year DATE
);
INSERT INTO reservation ( person, hotel, year )
SELECT 'Person ' || LEVEL, 'Hotel Paris', DATE '2017-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 168
UNION ALL
SELECT 'Person ' || LEVEL, 'Hotel Paris', DATE '2012-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 52
UNION ALL
SELECT 'Person ' || LEVEL, 'Hotel Bristol', DATE '2017-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 97
UNION ALL
SELECT 'Person ' || LEVEL, 'Hotel Bristol', DATE '2012-01-01' + LEVEL FROM DUAL CONNECT BY LEVEL <= 205;
输出:
\n酒店 | NUM_RESERVATIONS | 年\n :------------ | ---------------: | ---:\n布里斯托尔酒店 205 | 2012年\n巴黎酒店 168 | 2017年\n
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.