在每个组中选择倒数第二条记录。

7

有一个表 Remark,其中包含如下所示的数据:

       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是连续的。RemarkNo越大,备注越晚添加。因此,SerialNo为10的倒数第二个RemarkNo是带有描述'rainy'的1。

SELECT r1.* FROM remark r1 LEFT JOIN remark r2 ON (r1.serial_no = r2.serial_no AND r1.remark_no < r2.remark_no) WHERE r2.remark_no IS NULL; -- 这将返回最后一条记录 - Kim Stacks
它不应该返回 10|1|Sunny 吗? - Kevin Bowersox
@KevinBowersox在我的问题中添加了我的假设。 - Kim Stacks
请查看以下问题是否有所帮助:https://dev59.com/enI-5IYBdhLWcg3wW3Cp。如果是这样,您可以按照RemarkNo降序对表进行排序,然后保留每个SerialNo的第二行。在支持ROW_NUMBER窗口函数的数据库中很容易实现。 - BellevueBob
3个回答

5

尝试:

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

(请点击此处SQLFiddle。)

谢谢,马克。我稍微编辑了你的SQLFiddle,使它更易读一些。http://sqlfiddle.com/#!2/d2cd5/4 - Kim Stacks

0

这里是一些 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

0

这是一个完全无效的解决方案,但它能够工作...

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

工作示例:http://sqlfiddle.com/#!2/a1f89/22


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接