繁体   English   中英

SELECT 每年预订次数最多的酒店名称 Oracle sql (Query)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM