【问题标题】:SQL for MAX for each Group每个组的 MAX 的 SQL
【发布时间】:2012-11-25 19:59:06
【问题描述】:

我有 4 张桌子。我试图为每个汽车品牌获得最大价值。有10个品牌。我想知道每个品牌哪辆车最贵。

我做的第一件事是将所有我想从中获取信息的表格分组。 我已经加入了 BRAND、MODEL、CLASS 和 VEH 表。但是,我不确定如何获得每个组的最大值。

SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR,  V.VEH_PRICE

FROM ((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID)
INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID)
INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID

我试过了:

SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR,  V.VEH_PRICE
FROM (
SELECT B.BRAND_NAME, MAX(V.VEH_PRICE)
FROM ((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID)
INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID)
INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID
GROUP BY B.BRAND_NAME
);

我得到:

【问题讨论】:

    标签: sql ms-access group-by max correlated-subquery


    【解决方案1】:

    如果您只想要每个品牌的最高车辆价格,您的加入就可以了。它只需要一个GROUP BYMAX() 函数(请注意,您不需要Class 表):

    SELECT B.BRAND_NAME, 
           MAX(V.VEH_PRICE) AS MAX_VEH_PRICE
    
    FROM ( VEHICLE V
      INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID )
      INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID
    
    GROUP BY B.BRAND_ID, B.BRAND_NAME ;
    

    要获取价格最高的车辆的所有车辆数据,您需要在子查询(派生表)中编写上一个查询,然后再次连接:

    SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR,  V.VEH_PRICE
    
    FROM  
        ( ((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID)
          INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID)
          INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID
        )
    
      INNER JOIN
    
        ( SELECT M.BRAND_ID, 
                 MAX(V.VEH_PRICE) AS VEH_PRICE  
          FROM (VEHICLE V
            INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID)
          GROUP BY M.BRAND_ID 
        ) AS derived
    
        ON  b.BRAND_ID = derived.BRAND_ID
        AND v.VEH_PRICE = derived.VEH_PRICE ;
    

    【讨论】:

    • 嗨@ypercube,我尝试了第二个语句,但我得到“加入表达式不支持。它突出显示代码的最后一部分“ON(b.BRAND_ID = derived.BRAND_ID AND v.VEH_PRICE = derived .VEH_PRICE ) ;"
    • 立即尝试。 Access 在它需要的地方和不需要括号的地方是相当有趣的。
    • 是的,我删除了 on 语句周围的括号,它似乎正在工作。我将在那里按顺序进行陈述,希望我可以让它发挥作用。除此之外,这正是我想要完成的。非常感谢您的帮助。
    • 您也可以保存我的第一个查询或派生的子查询,然后将其与INNER JOIN derived ON ... 一起使用,就像它是一个表一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2021-08-28
    • 2016-08-04
    • 2019-07-30
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多