Вычтите первые две строки только для каждого значения - PullRequest
1 голос
/ 22 июля 2011

У меня есть конкретный запрос для выполнения, который должен вычесть две строки друг от друга.Он не должен вычитать всю строку, а только указанные поля.Данные, которые я пытаюсь вычесть, упорядочены следующим образом:

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 .

Я нашел сообщение, в котором показано, как это сделать, но разница междуих данные и мои, что у меня нет поля идентификатора, которое может отслеживать, на какой я линии.Я пытался использовать row_number (), но мой сервер sql не поддерживает его.

Возможно ли это даже без использования поля id?Я забыл упомянуть, что каждый объект имеет более двух записей временных отметок, но мне действительно нужно сделать это только для двух последних.

Ответы [ 2 ]

0 голосов
/ 02 мая 2014
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, поэтому я не уверен, что использовал функцию, которая мне не разрешена.Я думаю, что вы должны использовать предел вместо вершины.

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
0 голосов
/ 22 июля 2011

Если вам нужны только два последних, этот уродливый запрос должен это сделать:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...