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;
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;