SELECT 每年预订量最高的酒店名称 Oracle sql (查询)
SELECT hotel name with highest number of reservations in each year Oracle sql (Query)
我想要我的SELECT到return每年预订人数最多的酒店名称。如果在这种情况下有不止一家酒店,则应显示所有这些酒店。它还应该return每个酒店的预订数量。
输出应该是这样的:
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;
输出:
HOTEL | NUM_RESERVATIONS | YEAR
:------------ | ---------------: | ---:
Hotel Bristol | 205 | 2012
Hotel Paris | 168 | 2017
db<>fiddle here
我想要我的SELECT到return每年预订人数最多的酒店名称。如果在这种情况下有不止一家酒店,则应显示所有这些酒店。它还应该return每个酒店的预订数量。
输出应该是这样的:
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;
输出:
HOTEL | NUM_RESERVATIONS | YEAR :------------ | ---------------: | ---: Hotel Bristol | 205 | 2012 Hotel Paris | 168 | 2017
db<>fiddle here