【问题标题】:select max 'rental price' for each (car, model)为每个(汽车、型号)选择最高“租赁价格”
【发布时间】:2018-10-07 07:59:57
【问题描述】:

我有两张桌子;

表 A:

+--------+-----------+-------------+
| rentID | carNumber | rentalPrice |
+--------+-----------+-------------+
| Q16    | 2255DFS   |        1150 |
| Q14    | 1104RDC   |         250 |
| Q02    | 1475MHG   |         447 |
| Q11    | 8552FCG   |         214 |
+--------+-----------+-------------+

表 B:

+---------+------------+--------+
| number  |   brand    | model  |
+---------+------------+--------+
| 2255FDS | AUDI       | A3     |
| 1104RDC | AUDI       | A4     |
| 1475MHG | VOLKSWAGEN | PASSAT |
| 8552FCG | VOLKSWAGEN | POLO   |
+---------+------------+--------+

我需要获取每个汽车品牌和型号、rentID、汽车品牌和汽车型号的最大出租价格。

对于给定的表格,我想要得到的输出是:

  1. Q16 奥迪 A3 1150
  2. Q02 大众帕萨特 447

到目前为止,我得到了这个:

SELECT c.brand, c.model,
       MAX(r.rentalPrince) AS maxRentalPrice

FROM ( RENTAL_DETAILS R
  INNER JOIN CAR C ON c.number = r.carNumber )

GROUP BY c.brand, c.model;

但如果我也尝试选择rentID,我只会得到表中的所有租金。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用分析函数:

    SELECT rc.*
    FROM (SELECT c.brand, c.model, r.*,
                 MAX(r.rentalPrice) OVER (PARTITION BY c.brand, c.model) as max_rp
          FROM RENTAL_DETAILS r INNER JOIN
               CAR c
               ON c.number = r.carNumber
         ) rc
    WHERE rentalPrice = max_rp;
    

    【讨论】:

    • 使用 'r.*' 它显示了表的所有列,但我的原始表有 5 列,我只想选择 'rentID' 和 'rentalPrice'。我该怎么做?
    • @Cpastor27 。 . .只需在内部查询或外部查询中选择所需的列。 * 只是为了方便,因为选择列与您提出的问题并不真正相关。
    【解决方案2】:

    您能否使用子查询首先找到最高租金价格,然后使用其结果来驱动对感兴趣列的查询?

    select r.rentalPrice, c.brand, c.model, r.rentID
    from cars c 
    join rentals r on c.carNumber = r.number
    where r.rentalPrice in (
      select max(r.rentalPrice) 
      from rentals r
      join cars c on r.number = c.carNumber 
      group by c.brand, c.model);
    

    如果您以相同的最高价格租用 >1 次租金,那么这可能不会给出正确的结果。

    【讨论】:

    • 是的,这就是我现在面临的问题,当我应该得到 8 行时,我得到了 9 行。
    • 同一品牌和型号的两辆汽车的租赁价格相同。
    • 如果我们期望每个汽车品牌和型号的组合只有一行,例如奥迪 A3 排了一排,但是这辆车在 2 次交易中以相同的最高价格租用,那么您不希望rentID 的值是 2 倍吗?
    • 是的,我错了,我租了一辆 AUDI A4,租了 2 次,最高价格相同,但每次交易的rentID 不同,所以我认为它工作正常。
    • tysm 顺便说一句,我为此苦苦挣扎了 1 个小时
    【解决方案3】:
    SELECT 
        * 
    FROM 
    (SELECT 
        Brand 
        ,carNumber 
        ,rentalprice
        ,RANK() OVER (PARTITION BY brand ORDER BY rentalprice DESC) AS highest 
    FROM 
        dbo.Table_A
    JOIN dbo.Table_B ON Number=carNumber) filterdtable
    WHERE filterdtable.highest = 1
    

    使用派生表过滤结果。希望这可以帮助!

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多