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