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

つまり、各グループの最後から 2 番目のレコードを返す必要がありますか?

SerialNo のすべての RemarkNo が連続していると仮定します。発言番号が大きいほど発言が遅い。したがって、SerialNo 10 の最後から 2 番目の RemarkNo は、Desp 'rainy' の 1 です。

4

3 に答える 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。

于 2013-03-16T19:28:27.637 に答える
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
于 2013-03-16T19:20:36.273 に答える
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

于 2013-03-16T19:21:10.347 に答える