V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ackfin01
V2EX  ›  程序员

SQL 在分组查询时,怎么获取最新一条记录

  •  
  •   ackfin01 · 2018-11-30 14:18:58 +08:00 · 7190 次点击
    这是一个创建于 1973 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表 A 和表 B,为 1 对多关系,如何查询对于某个 A,多个 B 中最近更新的那一条记录

    14 条回复    2018-11-30 18:21:56 +08:00
    gzq527
        1
    gzq527  
       2018-11-30 14:32:39 +08:00
    每组最新的那一条?
    ackfin01
        2
    ackfin01  
    OP
       2018-11-30 14:46:23 +08:00
    @gzq527 嗯 有个字段纪录了更新时间
    gzq527
        3
    gzq527  
       2018-11-30 15:17:16 +08:00
    loongwang
        5
    loongwang  
       2018-11-30 15:51:27 +08:00
    SELECT B.*
    FROM B b1 JOIN
    (select b2.x,max(b.date)
    FROM B b2 JOIN A ON b2.x=A.x
    loongwang
        6
    loongwang  
       2018-11-30 15:54:14 +08:00
    这样行吗,看着有点丑
    SELECT B.*
    FROM B b1 JOIN
    (
    select A.x,max(b.date)
    FROM B b2 JOIN A ON b2.x=A.x
    GROUP BY A.x
    ) C ON b1.x=C.x where b1.date=C.date
    ackfin01
        7
    ackfin01  
    OP
       2018-11-30 16:03:56 +08:00
    @gzq527
    这个只 GROUP BY b.USER_ID; 还可以 SELECT ID,USER_ID,problems,last_updated_date ?
    ackfin01
        8
    ackfin01  
    OP
       2018-11-30 16:16:00 +08:00
    @loongwang em...应该可以,不过感觉用 date 做比较条件,也行吧
    killaboy712
        9
    killaboy712  
       2018-11-30 16:22:43 +08:00
    先把 B 表分组排序,row_number() over(partition by xx order by 时间) as 'rk',然后 select * from B 排序后的表,where rk =1,再将其与 A 表关联
    fanhaipeng0403
        10
    fanhaipeng0403  
       2018-11-30 16:24:18 +08:00
    fanhaipeng0403
        11
    fanhaipeng0403  
       2018-11-30 16:24:26 +08:00
    查询返回每个 id 的前 5

    SELECT yourtable.* FROM yourtable INNER JOIN ( SELECT id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year FROM yourtable GROUP BY id) group_max ON yourtable.id = group_max.id AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5 ORDER BY yourtable.id, yourtable.year DESC
    ackfin01
        12
    ackfin01  
    OP
       2018-11-30 16:39:14 +08:00
    @watzds
    @killaboy712
    学到了~ Thx!
    lueffy
        13
    lueffy  
       2018-11-30 18:14:40 +08:00
    mark 一下
    Magic347
        14
    Magic347  
       2018-11-30 18:21:56 +08:00
    @killaboy712 漂亮,这里需要用到开窗函数,分组之后的 topk 问题的典型用例
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1136 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:49 · PVG 06:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.