MySql在group by中取最大值

时间:2017-01-16 14:38:01

标签: mysql sql greatest-n-per-group

我有这张桌子:

id|date      |x |y
1 |2017-01-01|1 |0
2 |2017-01-01|23|1
4 |2017-01-02|1 |0

我会选择列x和日期,其中按日期分组的行具有最高的y值。

在这种情况下我会:

id|date      |x |
2 |2017-01-01|23|
4 |2017-01-02|1 |

此表源自另一个联接:

X表:

date
2017-01-01
2017-01-02
....

Y表:

from      |to        |x |y 
2017-01-01|2017-01-10|1 |0
2017-01-01|2017-01-05|23|1

X在from和to之间加入Y.

我该怎么办?提前谢谢。

3 个答案:

答案 0 :(得分:2)

在子查询中,找到每个日期的最大值(y),然后加入到此。

select b.*
from MyTable b
inner join
  (
    select a3.date, max(a3.y) as maxy
    from MyTable a3
    group by a3.date
  ) a
  on a.date = b.date
  and b.y = a.maxy

在这里演示:

SQL Fiddle

答案 1 :(得分:2)

@JohnHC给出的答案的替代方案是使用相关子查询:

SELECT t1.*
FROM yourTable t1
WHERE t1.y = (SELECT MAX(y) FROM yourTable t2 WHERE t2.date = t1.date)

虽然我希望这比连接选项运行得慢,但至少对于较大的数据集,这可以选择不那么冗长。

在这里演示:

SQL Fiddle

答案 2 :(得分:0)

将表连接到自己,日期相同,以便第二个表的x大于第一个表。然后过滤以便只保留结果,其中第二个x为NULL,表示第一个x是最大值

SELECT a.*
FROM myTable a
LEFT OUTER JOIN myTable b
    ON a.date = b.date AND a.x < b.x
WHERE b.x IS NULL;