2011-07-22 33 views
1

我有一个特定的查询来运行,它应该相互减去两行。它不应该减去整行,而只是指定的字段。我想减去数据的组织,像这样:仅为每个值减去前两行

object # |  timestamp  | input_rate1 | output_rate1 | ... 

    obj1 | 2011-07-20 05:53:33 | 349393 | 25843  | ... 

    obj1 | 2011-07-20 05:23:20 | 222293 | 11019  | ... 

结果将被00:30:13 | 127100 | 48824 .

我发现了一个贴子,展示了如何做到这一点,但他们的数据之间的差异和我是我没有一个可以跟踪我所处位置的ID字段。我尝试使用row_number(),但我的SQL服务器不支持它。

这甚至可能不使用ID字段?我忘了提及每个对象都有两个以上的时间戳记录,但我真的只需要为最后两个记录做这件事。

+0

我认为这是用于多个对象,因此对于每个obj-id,这应该发生? – Wrikken

+0

@Wrikken是的。我目前被困在这个问题上。下面的Edgar指出我正确的方向,以获得与每个obj-id关联的最大时间戳记行。我如何获得每个obj-id的第二行?我尝试使用限制1,1,但似乎只返回表的第二个结果。 – Christopher

回答

0

如果你只想要两个最新的这个丑陋的查询应该这样做:

SELECT TIMEDIFF(FIRSTTIME.timestamp,SECONDTIME.timestamp), FIRSTTIME.inputrate1 - SECONDTIME.inputrate1, FIRSTTIME.outputrate1 - SECONDTIME.outputrate1 
FROM 
((SELECT * FROM `table` HAVING timestamp = max(timestamp)) as FIRSTTIME, 
(SELECT * FROM `table` ORDER BY TIMESTAMP LIMIT 1,1) as SECONDTIME) 
+0

我能够获得与每个obj-id关联的最大时间戳记行,但是我无法获取每个obj-id的max(如果desc)以下的行。 – Christopher

+0

(SELECT * FROM'table' ORDER BY TIMESTAMP LIMIT 1,1)获取它 –

0
SELECT TIMEDIFF(FIRSTTIME.timestamp,SECONDTIME.timestamp), FIRSTTIME.inputrate1 - SECONDTIME.inputrate1, FIRSTTIME.outputrate1 - SECONDTIME.outputrate1 FROM 
    (SELECT TOP 2 * FROM tableNAME WHERE objectNumber = 'obj1' ORDER BY timestamp DESC) A, 
    (SELECT * FROM A WHERE MAX(timestamp) FIRSTTIME, 
    (SELECT * FROM A WHERE MIN(timestamp)) SECONDTIME 

您可能需要我承担一点,我使用Oracle和SQL主要所以我不知道我使用了我不允许的功能。 我认为你必须使用limit而不是top。

SELECT TIMEDIFF(FIRSTTIME.timestamp,SECONDTIME.timestamp), FIRSTTIME.inputrate1 - SECONDTIME.inputrate1, FIRSTTIME.outputrate1 - SECONDTIME.outputrate1 FROM 
    (SELECT * FROM (SELECT * FROM tableNAME WHERE objectNumber = 'obj1' ORDER BY timestamp DESC) LIMIT 2) A, 
    (SELECT * FROM A WHERE MAX(timestamp) FIRSTTIME, 
    (SELECT * FROM A WHERE MIN(timestamp)) SECONDTIME