问题的主题不是很清楚,对不起。
雅,所以问题如下: 我有一个数据库结构如下,其中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个子查询)来找到 前两个中有两个,第三个查询减去它。有什么建议吗?
答案 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