【问题标题】:Select the SECOND LAST record in each group选择每组中的 SECOND LAST 记录
【发布时间】:2013-03-05 09:31:26
【问题描述】:

有一个表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 都是连续的。备注编号越大,备注越晚。因此,SerialNo 10 的倒数第二个 RemarkNo 是 1 且 Desp 为“rainy”。

【问题讨论】:

  • SELECT r1.* FROM remark r1 LEFT JOIN remark r2 ON (r1.serial_no = r2.serial_no AND r1.remark_no
  • 不应该返回10|1|Sunny吗?
  • @KevinBowersox 在我的问题中添加了我的假设。
  • 看看这个问题是否有帮助:stackoverflow.com/q/1895110/1275871。如果是这样,您可以按 RemarkNo 降序对表格进行排序,然后为每个 SerialNo 保留第二行。在支持 ROW_NUMBER 窗口函数的数据库中很容易。

标签: mysql greatest-n-per-group mysql-workbench dml sqlyog


【解决方案1】:

试试:

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 here.)

【讨论】:

  • 谢谢你,马克。我对您的 SQLFiddle 进行了一些编辑,以使其对自己更具可读性。 sqlfiddle.com/#!2/d2cd5/4
【解决方案2】:

完全无效的解决方案,但有效...

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2015-03-23
      相关资源
      最近更新 更多