6

次のスキーマを持つテーブルがあります。

id, field, time
3, 'test0', 2012-08-29
3, 'test1', 2012-08-30
3, 'test2', 2012-08-31
2, 'test0', 2012-08-19
2, 'test1', 2012-08-20
2, 'test2', 2012-08-26
...

リスト内のすべてのIDについて、最後の値と最後の値の前を見つける必要があります。たとえば、ids = [2,3]の場合、結果は次のようになります。

3, 'test1', 2012-08-30
3, 'test2', 2012-08-31 
2, 'test1', 2012-08-20
2, 'test2', 2012-08-26

最後の値だけが必要な場合は、

SELECT *
FROM table
WHERE id IN (2, 3)
GROUP BY id

これをどのように達成できるかについてのアイデアはありますか?

4

2 に答える 2

3

各ID番号の時間が一意である場合、これは機能します。

SELECT d.id, d.field,d.time
  FROM d d
  JOIN (
    SELECT max(d.time)m, d.id
      FROM d
      JOIN (
         SELECT max(time) m, id
           FROM d
       GROUP BY id
      )e ON d.id=e.id AND e.m>d.time
      GROUP BY d.id
   )e ON d.time >= e.m AND d.id = e.id

これがどのように機能するかです。このネストされたクエリは、各IDの最新の時刻を取得します。

         SELECT max(time) m, id
           FROM d
       GROUP BY id

次に、これはこのクエリにネストされます。これにより、各IDの2番目に遅い時刻(最新の時刻を除く行のサブセットの最新の時刻)がわかります。

    SELECT max(d.time)m, d.id
      FROM d
      JOIN (
         SELECT max(time) m, id
           FROM d
       GROUP BY id
      )e ON d.id=e.id AND e.m > d.time

最後に、完全なクエリ(上に最初に表示)は、最後から2番目の時刻以上の時刻を持つすべての行を取得します。

時刻が一意でない場合、つまり、同じIDと時刻が表示される行がある場合、IDごとに3つ以上の行を取得する可能性があります。しかし、あなたは常に最新の2つの時間を取得します。

特定のIDに1行しかない場合、それを取得することはできません。

それらの制限が許容できるかどうかを知っているのはあなただけです。

フィドルに行こう! http://sqlfiddle.com/#!2/82719/5/0

于 2012-09-01T18:35:17.220 に答える
1

これを試してみてください

SELECT *
    FROM table
    WHERE id = '1'
    ORDER BY `id` desc
    LIMIT 0,2
UNION
    SELECT *
    FROM table
    WHERE id = '2'
    ORDER BY `id` desc
    LIMIT 0,2

アップデート:

このようなことも試すことができる場合:

SELECT t1.*
FROM `tablename` t1
LEFT OUTER JOIN `tablename` t2
  ON (t1.id = t2.id AND t1.time > t2.time)
GROUP BY t1.id, t1.field, c1.time
HAVING COUNT(*) < 2;

参照

于 2012-09-01T18:25:36.900 に答える