[英]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.