Дискретная производная в SQL - PullRequest
9 голосов
/ 21 октября 2010

У меня есть данные датчика в таблице в виде:

Time      Value
10        100
20        200
36        330
46        440

Я хотел бы получить изменение значений для каждого периода времени. В идеале хотелось бы получить:

Starttime Endtime   Change
10        20        100
20        36        130
36        46        110

Мои навыки SQL довольно просты, поэтому я склонен вытащить все данные в сценарий, который их обрабатывает, а затем перенести их обратно в новую таблицу, но я подумал, что спросить, есть ли удобный способ сделать все это в базе данных.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010
Select a.Time as StartTime, b.time as EndTime, b.time-a.time as TimeChange, b.value-a.value as ValueChange
FROM YourTable a, YourTable b
WHERE b.time = (Select MIN(c.time) FROM YourTable c WHERE c.time>a.time)
2 голосов
/ 21 октября 2010
Select a.Time as StartTime
     , b.time as EndTime
     , b.time-a.time as TimeChange
     , b.value-a.value as ValueChange
FROM YourTable a 
Left outer Join YourTable b ON b.time>a.time
Left outer Join YourTable c ON c.time<b.time AND c.time > a.time
Where c.time is null
Order By a.time
0 голосов
/ 21 октября 2010

Это работает?

WITH T AS
(
SELECT [Time]
    ,  Value
    ,  RN1 =  ROW_NUMBER() OVER (ORDER BY [Time])
    ,  RN2 =  ROW_NUMBER() OVER (ORDER BY [Time]) - 1   
FROM  SensorData
)
SELECT  
   StartTime = ISNULL(t1.[time], t2.[time])
 , EndTime = ISNULL(t2.[time], 0)
 , Change = t2.value - t1.value

FROM    T t1 
    LEFT OUTER JOIN 
        T t2

ON t1.RN1 = t2.RN2
0 голосов
/ 21 октября 2010

Прежде всего, я бы добавил столбец id в таблицу, чтобы у вас было что-то, что предсказуемо увеличивается от строки к строке.

Затем я бы попробовал следующий запрос:

SELECT t1.Time AS 'Starttime', t2.Time AS 'Endtime',
    (t2.Value - t1.Value) AS 'Change'
FROM SensorData t1
INNER JOIN SensorData t2 ON (t2.id - 1) = t1.id
ORDER BY t1.Time ASC

Я собираюсь создать тестовую таблицу, чтобы попробовать это для себя, поэтому я не знаю, работает ли она еще, но стоит попробовать!

Обновление Исправлено с одной незначительной проблемой(ИЗМЕНЕНИЕ - защищенное слово, и его нужно было заключить в кавычки), но проверило его, и оно работает!Он дает в точности результаты, определенные выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...