SQL 加上 Return 仅列中出现频率最高的值

SQL PLUS Return ONLY the most frequent value in a column

SQL 加上: 我正在尝试 return 仅 table 中最频繁的 'MAKE' 和另一个 table 中的 'NAME' 客户。这是我的:

 SELECT sv.make, c.first, c.MI, c.last
  FROM Sales s
   INNER JOIN Sale_Vehicles sv
    ON s.VIN = sv.VIN
   INNER JOIN Customers c
    ON s.cust_ID = c.cust_ID
  GROUP BY sv.make, c.first, c.MI, c.last
  ORDER BY sv.make, COUNT (*) DESC;

这个 return 是最常见的 'MAKE' 在结果的顶部,第二和第三在它下面。我如何只return最频繁?

可以将结果用作 rownum 的子选择检查

select * from ( 
 SELECT sv.make, c.first, c.MI, c.last
  FROM Sales s
   INNER JOIN Sale_Vehicles sv
    ON s.VIN = sv.VIN
   INNER JOIN Customers c
    ON s.cust_ID = c.cust_ID
  GROUP BY sv.make, c.first, c.MI, c.last
  ORDER BY sv.make, COUNT (*) DESC) T 
  where rownum =1

如果您需要最频繁的 MAKE(即 COUNT 是最大的那个),您应该先按 COUNT 排序,而不是按 MAKE 排序。像这样:

SELECT *
FROM (SELECT sv.make, c.first, c.MI, c.last
     FROM Sales s
     INNER JOIN Sale_Vehicles sv
       ON s.VIN = sv.VIN
     INNER JOIN Customers c
       ON s.cust_ID = c.cust_ID
     GROUP BY sv.make, c.first, c.MI, c.last
     ORDER BY COUNT (*) DESC               --> different from your ORDER BY
    )
WHERE rownum = 1;

[编辑]

对;如果不止一个 MAKE 满足条件,那么 RANK 分析函数可能会有所帮助。这是一个基于 Scott 架构的示例:

工作频率:

SQL> select job, count(*)
  2  from emp
  3  group by job
  4  order by count(*) desc;

JOB         COUNT(*)
--------- ----------
CLERK              4
SALESMAN           4
MANAGER            3
ANALYST            2
PRESIDENT          1

让我们给他们排名:

SQL> select job, count(*),
  2    rank() over (order by count(*) desc) rn
  3  from emp
  4  group by job
  5  order by count(*) desc;

JOB         COUNT(*)         RN
--------- ---------- ----------
CLERK              4          1    --> these 2 should be returned as the 
SALESMAN           4          1    --> final result
MANAGER            3          3
ANALYST            2          4
PRESIDENT          1          5

最终结果:

SQL> select *
  2  from (select job, count(*), rank() over (order by count(*) desc) rn
  3        from emp
  4        group by job)
  5  where rn = 1;

JOB         COUNT(*)         RN
--------- ---------- ----------
CLERK              4          1
SALESMAN           4          1

应用于您的查询:

select *
  from (  select sv.make,
                 c.first,
                 c.mi,
                 c.last,
                 rank () over (order by count (*) desc) rn             --> new
            from sales s
                 inner join sale_vehicles sv on s.vin = sv.vin
                 inner join customers c on s.cust_id = c.cust_id
        group by sv.make,
                 c.first,
                 c.mi,
                 c.last)
 where rn = 1;

有什么改进吗?

WITH most_frequent AS (
SELECT *
FROM (SELECT sv.make
     FROM Sales s
     INNER JOIN Sale_Vehicles sv
       ON s.VIN = sv.VIN
     GROUP BY sv.make
     ORDER BY COUNT (*) DESC
    )
WHERE rownum = 1 
)
SELECT sv.make, c.first, c.MI, c.last
  FROM Sales s
   INNER JOIN Sale_Vehicles sv
    ON s.VIN = sv.VIN
   INNER JOIN Customers c
    ON s.cust_ID = c.cust_ID
   INNER JOIN most_frequent mf
    ON sv.make=mf.make;