繁体   English   中英

如何在SQL结果中选择下一个记录值

[英]How to select next record value in sql result

编辑 :为了澄清有很多用户,每个用户有很多记录,这是用户活动的日志表,

如何找到满足某些条件的每个记录和后续记录的时间戳差异,

例如假设表格是这样的

| id |u_id| .. | timestamp          | 
|----|----|----|--------------------|
| 50 | 1  | .. | 2014-04-22 15:35:44|
| 90 | 2  | .. | 2014-04-22 13:35:44|
| .. | .. | .. | .....              |

如何仅针对一个用户ID找到每条记录与下一条记录之间的时差?

假设您想对所有用户执行此操作,最简单的方法是使用变量:

select t.*,
       if(u_id = @u_id, timediff(`timestamp`, @timestamp), NULL) as diff,
       @timestamp := `timestamp`, @u_id := u_id
from table t cross join
     (select @timestamp := 0, @u_id := 0) var
order by u_id, timestamp;

明确地对记录进行排序很重要,以确保处理按顺序进行。

尝试

select timediff(`timestamp`, @lasttime),
       @lasttime := `timestamp`
from your_table
cross join (select @lasttime := 0) d
where u_id = 1
order by id

您可以通过两种方法进行操作,第一种是使用相关子查询:

SELECT  T.id,
        T.u_id,
        timestamp,
        (   SELECT  T2.timestamp
            FROM    T AS T2
            WHERE   T2.u_id = T.u_id
            AND     T2.timestamp > T.timestamp
            ORDER BY T2.Timestamp
            LIMIT 1
        ) AS NextTimeStamp
FROM    T;

或者,您可以使用JOIN进行此操作。

SELECT  T.id,
        T.u_id,
        T.timestamp,
        T2.timestamp AS NextTimeStamp
FROM    T
        LEFT JOIN T AS T2
            ON T2.u_id = T.u_id
            AND T2.timestamp > T.timestamp
        LEFT JOIN T AS T3
            ON T3.u_id = T.u_id
            AND T3.timestamp > T.timestamp
            AND T3.timestamp < T2.timestamp
WHERE   T3.id IS NULL;

哪一个最佳取决于您的实际需求,数据量和索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM