Sql根据ID查找两行之间的timediff

时间:2013-08-08 04:30:36

标签: mysql sql algorithm

问题的主题不是很清楚,对不起。

雅,所以问题如下: 我有一个数据库结构如下,其中pk是主键,id 很多行都是多重的东西。

+------+------+---------------------+
| pk   | id   | value               |
+------+------+---------------------+
|   99 |    1 | 2013-08-06 11:10:00 |
|  100 |    1 | 2013-08-06 11:15:00 |
|  101 |    1 | 2013-08-06 11:20:00 |
|  102 |    1 | 2013-08-06 11:25:00 |
|  103 |    2 | 2013-08-06 15:10:00 |
|  104 |    2 | 2013-08-06 15:15:00 |
|  105 |    2 | 2013-08-06 15:20:00 |
+------+------+---------------------+

真正需要的是,每个行的前两行(按值排序)之间的值差异 组(其中组是id)。所以根据我需要的上述结构 timediff(value100,value99)[用于id 1组] 和timediff(value104,value103)[用于id 2组]

即。每组前两行按值排序的时间值差异。

我能想到的一种方法是通过3个自连接(或3个子查询)来找到 前两个中有两个,第三个查询减去它。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

试试这个.. CTE非常强大!

WITH CTE AS (
  SELECT 
  value, pk, id,
    rnk = ROW_NUMBER() OVER ( PARTITION  BY id order by id DESC)
    , rownum = ROW_NUMBER() OVER (ORDER BY id, pk)
     FROM test
)
SELECT
  curr.rnk, prev.rnk, curr.rownum, prev.rownum, curr.pk, prev.pk, curr.id, prev.id, curr.value, prev.value, curr.value - prev.value
FROM CTE curr
INNER JOIN CTE prev on curr.rownum = prev.rownum -1 and curr.id = prev.id 
and curr.rnk <=1

答案 1 :(得分:0)

看起来有点奇怪......但你可以这样试试

SET @previous = 0;
SET @temp = 0;
SET @tempID = 0;

可能不需要上面的步骤..但只是为了确保没有出错

SELECT pkid, id, diff, valtemp FROM (
SELECT IF(@previousID = id, @temp := @temp + 1, @temp := 1) occ, @previousID := id,
TIMEDIFF(`value`, @previous) diff, pk, id, `value`, @previous := `value` 
FROM testtable) a WHERE occ = 2

Demo on sql fiddle