SQL按一个表分组,最大按另一个表分组

时间:2020-09-07 16:22:13

标签: mysql sql datetime greatest-n-per-group window-functions

我有3个表abbcdc。现在,我想对a_id表中的ab进行分组,并从date表中选择最大c。这是我到目前为止尝试过的:

select ab.a_id, bcd.d_id, c.val, max(c.date) as date
from tableab ab, tablebcd bcd, tablec c
where ab.b_id = bcd.b_id
and bcd.c_id = c.c_id
group by ab.a_id

它可以正常工作,但不能给出正确的结果。我不太了解SQL,所以我可能缺少一些简单的东西。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

从现有查询开始,一种简单的方法是row_number()(仅在MySQL 8.0中可用)。

select * 
from (
    select 
        ab.a_id, 
        bcd.d_id, 
        c.val, 
        row_number() over(partition by ab.a_id order by c.date desc) as rn
    from tableab ab
    iner join tablebcd bcd on  ab.b_id = bcd.b_id
    inner join tablec c on bcd.c_id = c.c_id
) t
where rn = 1 

row_number()通过将a_id降序对具有相同date的记录进行排名-然后,您可以使用此信息来过滤表。

请注意,我将查询重写为使用标准的显式联接,而不是老式的隐式联接(在from子句中使用逗号):几十年前的这种语法不应在新代码中使用。