8

次のようなテーブルがあるとします。

Item         Description            Time
-----        -----------            -----
ItemA1       descript               08-16-2013 00:00:00
ItemA2       descript               08-16-2013 00:00:00
ItemA3       descript               08-16-2013 00:00:00
.
.
ItemAN       descript               08-16-2013 00:00:00

ItemB1       descript               08-13-2013 00:00:00
ItemB2       descript               08-13-2013 00:00:00
ItemB3       descript               08-13-2013 00:00:00
.
.
ItemBN       descript               08-13-2013 00:00:00
.
.
.
ItemX1       descript               01-13-2012 00:00:00
ItemX2       descript               01-13-2012 00:00:00
ItemX3       descript               01-13-2012 00:00:00
.
.
ItemXN       descript               01-13-2012 00:00:00

アイテムのグループは定期的に追加されます。アイテムのグループが追加されると、それらはすべて同じ「時間」フィールドで追加されます。「時間」は基本的に、そのアイテム グループの一意のインデックスとして機能します。

時間が 2 番目に高い項目のグループを選択したいと考えています。この例では、クエリは "B" アイテムを取得する必要があります。「A」項目を選択するためにmax( time) を実行できることはわかっていますが、最後から 2 番目の項目をどのように実行するかはわかりません。

それが何かを意味する場合、私の「時間」列は TIMESTAMP として保存されます。

4

10 に答える 10

20

次のようなものを試すことができます:

SELECT MAX(Time)
FROM yourTable
WHERE Time < (SELECT MAX(Time) FROM yourTable)

SQLFiddle Demo

于 2013-08-16T18:51:03.880 に答える
7

1 つのアプローチ:

SELECT t.*
 FROM mytable t
 JOIN ( SELECT l.time
          FROM mytable l
         GROUP BY l.time
         ORDER BY l.time DESC
         LIMIT 1,1 
      ) m
   ON m.time = t.time

これは、インライン ビュー (m のエイリアスが割り当てられている) を使用して、2 番目に「大きい」時間値を返します。GROUP BY は個別のリストを取得し、ORDER BY DESC は最新のものを最初に置きます。「トリック」は、2 行目を返す LIMIT です。LIMIT(m,n) = (最初の m 行をスキップし、次の n 行を返す)

その時間値を使用して元のテーブルに結合し、一致する時間値を持つすべての行を取得できます。


の先頭列を持つインデックスを使用すると、パフォーマンスが向上しますtime。(MySQLは「ファイルソートの使用」操作を回避し、インラインビュークエリからかなり迅速に結果を取得できるはずだと思います。)

ただし、インライン ビュー クエリに述語を含めて、2 番目の最新時刻が特定の日数を超えないことが「わかっている」場合は、パフォーマンスが低下することはありません。

   WHERE l.time > NOW() + INTERVAL -30 DAYS

timeしかし、それを追加すると、30 日以上前の場合、クエリは「2 番目に新しい」グループを返しません。

2番目に最新のSELECT MAX(time) WHERE time < ( SELECT MAX(time)ものを取得するアプローチ(他の回答で与えられたアプローチ)は、特に の先頭の列を持つインデックスがない場合、より高速になる可能性がありますがtime、パフォーマンスは実際のテストで測定するのが最適です。時間の先行列を持つインデックスも、MAX() アプローチを高速化します。)

LIMIT私が提供したクエリは、句を変更することで、4 番目に新しい、42 番目に新しいなどを取得するように簡単に拡張できます... LIMIT(3,1)LIMIT(41,1)など。

于 2013-08-16T18:51:58.863 に答える
1

次のクエリを使用して、2 番目、3 番目、4 番目に高い値を取得します。

SELECT MIN(value) from yourTable WHERE value IN( SELECT TOP N value FROM yourTable ORDER BY value DESC)

N を自分の数値に置き換えます。つまり、2 番目に高い値の場合は N=2、3 番目に高い値の場合は N=3 などです。したがって、2 番目に高い値を使用するには、次のようにします。

SELECT MIN(value) from yourTable WHERE value IN( SELECT TOP 2 value FROM yourTable ORDER BY value DESC)
于 2015-08-27T10:57:02.277 に答える
1
SELECT  T1.ITEM
FROM    YOURTABLE T1
WHERE   T1.TIME = ( SELECT  MAX(T2.TIME) 
                    FROM    YOURTABLE T2 
                    WHERE   T2.TIME < ( SELECT  MAX(T3.TIME) 
                                        FROM    YOURTABLE T3
                                    )
                )
于 2013-08-16T18:52:28.270 に答える
0

このような本当に簡単なものはうまくいくはずです

select * from my-table where time = 
  (Select top 1 time
     from (select top 2 time from my-table order by time desc)
   order by time asc)
于 2013-08-16T18:52:31.170 に答える
0

MYSQL: ベース ソリューションの制限

例: レコード 1、2、3、4、5。

LIMIT 2,1 は 3 番目に大きい数値を返し、LIMIT 1,1 は 2 番目に大きい数値を返すことを意味します。

rc を選択します。rc_officer_idFROM recovery_complain_officer rc ORDER BY rc. rc_officer_id説明制限 2,1

于 2018-03-10T12:10:54.820 に答える