在GROUP BY查询之后选择多个最大值

时间:2018-10-18 06:19:11

标签: sql sqlite group-by

假设我有一个像这样的表:

   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.19/3上,还有其他方法吗?

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()函数