1

次のようなテーブル構造があります。

Field       Type
id              int(11)      AI
user            varchar(64)
date            timestamp
key             int(11)

私がする必要があるのは、(指定された日から) 行を見つけることです。2 つの連続する行 (指定されたユーザーの最も近いタイムスタンプ) の差は 1300 未満です。

次のようなクエリを使用するように言われました:

select t.*
from (select t.*, @nextdate as nextdate, @nextdate := date
      from my_table t
      order by date desc
     ) t
where t.nextdate - t.date < 1300;

しかし、うまくいかなかったようです。誰かが私の仕事を解決するのを手伝ってくれますか?

4

3 に答える 3

1

これは、CURSOR を使用することが本当に最も適切でパフォーマンスの高いオプションであるまれなケースの 1 つと思われます。

ただし、パフォーマンスを考慮しない場合は、次のように相関サブクエリを実行できます。

SELECT *, second_time - first_time
   FROM
   (
      SELECT T.user, 
             T.date      AS first_time, 
             (SELECT MIN(S.date) 
                FROM My_Table S 
                WHERE S.user = T.user
                  AND S.date > T.date
             )                         AS second_time
        FROM My_Table T
   ) G
   WHERE (second_time - first_time) < 1300

これは、大規模なデータ セットでは非常にゆっくりと実行されます。

于 2013-07-07T17:15:02.150 に答える
1

これを試して :-

select t1.user, t1.date d1,t2.date d2 ,t1.date-t2.date
  from  (select @val:=@val+1 rowid,user,  date
           from mytable,(select @val:=0) a
       order by user,date) t1,

        (select @val1:=@val1+1 rowid,user,  date
           from mytable,(select @val1:=1) b
       order by user,date) t2

 where t1.rowid = t2.rowid
   and t1.user = t2.user
   and t1.date-t2.date < 1300;

デモを見る

于 2013-07-07T17:01:17.170 に答える