Mysql 选择每组中最后一条记录
有一个表备注,包含如下所示的数据:Mysql 选择每组中最后一条记录,mysql,greatest-n-per-group,mysql-workbench,dml,sqlyog,Mysql,Greatest N Per Group,Mysql Workbench,Dml,Sqlyog,有一个表备注,包含如下所示的数据: SerialNo | RemarkNo | Desp ============================================= 10 | 1 | rainy 10 | 2 | sunny 11 | 1 | sunny 11 | 2 | rainy
SerialNo | RemarkNo | Desp
=============================================
10 | 1 | rainy
10 | 2 | sunny
11 | 1 | sunny
11 | 2 | rainy
11 | 3 | cloudy
11 | 4 | sunny
12 | 1 | rainy
什么查询将返回以下结果:
10 | 1 | rainy
11 | 3 | cloudy
12 | null | null
也就是说,应该返回每组中最后一条记录的第二条吗
假设SerialNo的所有RemarkNo都是连续的。备注号越大,备注越晚。因此,SerialNo 10的第二个最后一个标记是1,带有Desp'rainy'。下面是一些sql伪代码,让您开始:
select
penultimate.*
from data as penultimate
left join (
/* query on data to return last row frome each group */
) as ultimate
on /* sql to join 2nd last record on each group to last group */
where not ultimate.SerialNo is null
完全无效的解决方案,但有效
SELECT
SerialNo,
RemarkNo,
(SELECT Desp
FROM Remarks
WHERE SerialNo = r3.SerialNo AND RemarkNo = r3.RemarkNo) Desp
FROM (
SELECT
r.SerialNo,
(SELECT r2.RemarkNo
FROM Remarks r2
WHERE r.SerialNo = r2.SerialNo
ORDER BY r2.RemarkNo DESC
LIMIT 1, 1) RemarkNo
FROM (SELECT DISTINCT SerialNo FROM Remarks) r) r3
工作示例:尝试:
select s.SerialNo, r.RemarkNo, r.Desp
from (select SerialNo, max(RemarkNo) maxRemark from Remark group by SerialNo) s
left join Remark r on s.SerialNo = r.SerialNo and s.maxRemark-1 = r.RemarkNo
选择r1.*从备注r1左侧连接r1.serial\u no=r2.serial\u no和r1.remark\u no