假设我有一个像这样的表:
date ID income
0 9/1 C 10.40
1 9/3 A 33.90
2 9/3 B 29.10
3 9/4 C 19.30
4 9/4 B 17.80
5 9/5 B 9.55
6 9/5 C 11.10
7 9/5 A 13.10
8 9/7 A 29.10
9 9/7 B 29.10
我想找出每个日期收入最高的ID。最直观的方法是编写
SELECT ID, MAX(income) FROM table GROUP BY date
但是有两个ID在9/7
上获得了相同的 MAX收入,我想保留同一日期的所有联系,通过使用该查询,我将忽略{ {1}}和9/7
出现在29.1
和9/3
上,还有其他方法吗?
答案 0 :(得分:0)
基于联接的方法不存在此问题,并且将保留在给定日期与最大收入挂钩的所有记录。
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT date, MAX(income) AS max_income
FROM yourTable
GROUP BY date
) t2
ON t1.date = t2.date AND t1.income = t2.max_income
ORDER BY
t1.date;
上述查询的工作方式是将完整的原始表连接到一个子查询,该子查询针对每个日期查找最大收入值。这具有过滤掉在给定日期没有最大收入的任何记录的效果。密切注意联接条件,它有两个部分,日期和收入。
如果您的数据库支持分析功能,我们也可以在此处使用RANK
:
SELECT date, ID, income
FROM
(
SELECT t.*, RANK() OVER (PARTITION BY date ORDER BY income DESC) rnk
FROM yourTable t
) t
WHERE rnk = 1
ORDER BY date;
答案 1 :(得分:0)
尝试使用子查询进行以下操作,因为您已经绑定了一个日期,所以请使用最小ID,这将为您提供9/7起的一个ID
select date,min(ID),income
from
(SELECT t1.date, t1.ID,t1.income
FROM tablename t1
INNER JOIN
(
SELECT date, MAX(income) AS mincome
FROM yourTable
GROUP BY date
) t2 ON t1.date = t2.date AND t1.income = t2.mincome
)X group by date,income
答案 2 :(得分:0)
一种方法可以像下面这样
with cte1
(
Select t1.*
FROM yourTable t1
INNER JOIN
(
SELECT date, MAX(income) AS max_income
FROM yourTable
GROUP BY date
) t2
ON t1.date = t2.date AND t1.income = t2.max_income
) select min(ID) as ID, date,income from cte1
group by date,income
因为您没有提到在两个ID的情况下(当特定日期的收入相同时)需要的ID,所以当两个ID的收入在特定日期相同时,我在其中取了最小ID,但同时您可能还要使用max()函数