如何获取max记录?

3vpjnl9f  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(282)

下面是我的sql代码:

SELECT
    v.veh_manufname AS "Manufacturer Name",
    COUNT(o.off_no) AS "Total No. of Offences"
FROM
    VEHICLE v JOIN OFFENCE o ON v.veh_vin = o.veh_vin
GROUP BY 
    v.veh_manufname

运行上述sql代码将返回:

Manufacturer Name    Total Offences
    Audi                      3
    Honda                     1
    Mack                      3
    Kia                       1
    Mercedes Benz             1
    Ferrari                   4
    Yamaha                    1
    BMW                       2
    Mini                      1
    Toyota                    1
    Harley Davidson           1
    Mazda                     4

如何以及在何处放置max aggregate函数,该函数将只提供具有最大违规次数的记录。
所需输出为:

Manufacturer Name    Total Offences
      Ferrari             4
      Mazda               4
nr9pn0ug

nr9pn0ug1#

一个简单的方法是 RANK :

WITH cte AS (
    SELECT
        v.veh_manufname AS "Manufacturer Name",
        COUNT(o.off_no) AS "Total No. of Offences",
        RANK() OVER (ORDER BY COUNT(o.off_no) DESC) rnk
    FROM VEHICLE v
    INNER JOIN OFFENCE o ON v.veh_vin = o.veh_vin
    GROUP BY v.veh_manufname
)

SELECT "Manufacturer Name", "Total No. of Offences"
FROM cte
WHERE rnk = 1;

我们还可以使用子查询来仅限制具有最大违规次数的车辆:

SELECT "Manufacturer Name", "Total No. of Offences"
FROM cte
WHERE "Total No. of Offences" = (SELECT MAX("Total No. of Offences") FROM cte);

如果希望直接修改当前查询,而不使用cte,可以在 HAVING 条款:

SELECT
    v.veh_manufname AS "Manufacturer Name",
    COUNT(o.off_no) AS "Total No. of Offences"
FROM VEHICLE v
INNER JOIN OFFENCE o ON v.veh_vin = o.veh_vin
GROUP BY v.veh_manufname
HAVING COUNT(o.off_no) = (SELECT MAX(max_off)
                          FROM (SELECT COUNT(o.off_no) AS max_off
                                FROM VEHICLE v
                                INNER JOIN OFFENCE o ON v.veh_vin = o.veh_vin
                                GROUP BY v.veh_manufname) t);
pexxcrt2

pexxcrt22#

有一种不用子查询的方法可以做到这一点,但有一个问题:
如果有两个或多个制造商的违规次数相同,会怎样?
这个 RANK() 函数是有用的,或者您可以使用 ROW_NUMBER() 在子查询中:

x.offences
From            (SELECT         v.veh_manufname,
                                COUNT(o.off_no) OVER (PARTITION BY v.veh_manufname) AS offences,
                                ROW_NUMBER() OVER (PARTITION BY v.veh_manufname ORDER BY o.off_no DESC) AS n
                From            VEHICLE v (NOLOCK)
                Left Outer Join OFFENCE o (NOLOCK) On o.veh_vin = v.veh_vin
                ) AS x
Order By        x.offences DESC,
                x.n DESC

这将给出一个结果,其中将显示违规次数最多和最近违规次数最多的制造商。

相关问题