5

问题的主题不是很清楚,抱歉。

是的,问题如下:我有一个如下的数据库结构,其中 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 个中找到前两个,然后第三个查询减去它。有什么建议么?

4

2 回答 2

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
于 2013-08-08T06:14:59.170 回答
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

关于 sql fiddle 的演示

于 2013-08-08T06:17:30.923 回答