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

2018-11-30 14:18:58 +08:00
 ackfin01

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

7203 次点击
所在节点    程序员
14 条回复
gzq527
2018-11-30 14:32:39 +08:00
每组最新的那一条?
ackfin01
2018-11-30 14:46:23 +08:00
@gzq527 嗯 有个字段纪录了更新时间
gzq527
2018-11-30 15:17:16 +08:00
watzds
2018-11-30 15:23:40 +08:00
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
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
2018-11-30 16:03:56 +08:00
@gzq527
这个只 GROUP BY b.USER_ID; 还可以 SELECT ID,USER_ID,problems,last_updated_date ?
ackfin01
2018-11-30 16:16:00 +08:00
@loongwang em...应该可以,不过感觉用 date 做比较条件,也行吧
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
2018-11-30 16:24:18 +08:00
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
2018-11-30 16:39:14 +08:00
@watzds
@killaboy712
学到了~ Thx!
lueffy
2018-11-30 18:14:40 +08:00
mark 一下
Magic347
2018-11-30 18:21:56 +08:00
@killaboy712 漂亮,这里需要用到开窗函数,分组之后的 topk 问题的典型用例

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513071

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX