2013-03-14 3 views
1

У меня есть запрос, который отображает информацию из таблицы следующим образом.sql Время выполнения отчетов

SELECT tag.label, inputs.input_raw, inputs.unix_timestamp, tag.inverted FROM inputs 
JOIN tag 
ON tag.tag_id = inputs.tag_id 
WHERE (inputs.tag_id = 92084) 

AND (inputs.date_time > dateadd(day,-1,getdate())) 
ORDER BY date_time DESC 

enter image description here

Я хотел бы написать запрос, который будет делать две вещи.

Мне нужно, чтобы каждый раз, когда input_raw переключается с '0' на '1'.

Мне также нужно общее время работы насоса, используя unix_timestamp ie. когда input_raw = 1.

У кого-нибудь есть идеи.

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

Благодаря

EDIT: В таблице также содержит поле дата_время, который соответствует значению UNIX_TIMESTAMP если существует способ date_time, который может быть использован>

+0

Какие СУБД вы используете? Oracle Postgres? –

+0

Я использую MSSQL 2008 r2 – Mildfire

ответ

3

Вы хотите использовать функцию Lead или Lag к сравните текущий результат с предыдущим или последующим. Эти функции, однако, введены в SQL Server 2012.

С помощью Mr. pinaldave мне удалось произвести следующий SQL Fiddle, который подсчитывает каждое изменение от 0 до 1.

;WITH x AS 
(
    SELECT 
    1 AS ldOffset, -- equiv to 2nd param of LEAD 
    1 AS lgOffset, -- equiv to 2nd param of LAG 
    NULL AS ldDefVal, -- equiv to 3rd param of LEAD 
    NULL AS lgDefVal, -- equiv to 3rd param of LAG 
    ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row, 
    label, 
    input_raw, 
    unix_timestamp, 
    inverted 
    FROM inputs 
) 
SELECT 
    COUNT(1) 
FROM x 
LEFT OUTER JOIN x AS xLg 
    ON x.row = xLg.row + x.lgOffset 
WHERE xLg.input_raw = 0 AND x.input_raw = 1; 

Вы можете использовать тот же Lag чтобы вычислить разницу между текущей меткой времени и предыдущей меткой времени.

EDIT:.

This SQL Fiddle должен показать, как получить общее время насос работает (вы должны будете определить running себя этот вопрос в настоящее время предполагается, что переход от 0 до 1 или пребывания 1 работает .. Вы также должны перепроверить мои расчеты временных меток, потому что я никогда не использовал Unix метки времени, прежде чем

;WITH x AS 
(
    SELECT 
    1 AS ldOffset, -- equiv to 2nd param of LEAD 
    1 AS lgOffset, -- equiv to 2nd param of LAG 
    NULL AS ldDefVal, -- equiv to 3rd param of LEAD 
    NULL AS lgDefVal, -- equiv to 3rd param of LAG 
    ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row, 
    label, 
    input_raw, 
    unix_timestamp, 
    inverted 
    FROM inputs 
) 
SELECT 
    SUM(DATEDIFF(mi, 
      DATEADD(ss, xLg.unix_timestamp,'01/01/1970'), 
      DATEADD(ss, x.unix_timestamp,'01/01/1970'))) 
FROM x 
LEFT OUTER JOIN x AS xLg 
    ON x.row = xLg.row + x.lgOffset 
WHERE 
    (xLg.input_raw = 0 AND x.input_raw = 1) 
OR 
    (xLg.input_raw = 1 AND x.input_raw = 1); 

EDIT 2:

Я думаю, самый простой способ проверить инвертировать изменение положение о WHERE к чему-то вроде:

WHERE 
    (x.inverted = 1 AND xLg.input_raw = 0 AND x.input_raw = 1) 
OR 
    (x.inverted = 0 AND xLg.input_raw = 1 AND x.input_raw = 0) 
+0

Отлично. Работая, чтобы рассказать мне количество циклов. Когда вы говорите: «Вы можете использовать одну и ту же функцию задержки для вычисления разницы между текущей меткой времени и предыдущей отметкой времени». Будет ли она добавлять все разности во времени, чтобы я получал грандиозный «общий насос времени»? Также еще одна вещь. Есть ли способ заставить sql использовать инвертированное поле в качестве условного. Например, если инвертировано значение 0, используйте условие от 0 до 1, но если инвертировано 1, используйте от 1 до 0? Еще раз спасибо – Mildfire

+0

или я предполагаю, что это лучший способ. Если инвертированное значение «1» обрабатывает «0» в input_raw как «1», а если инвертировано «0», оставьте его в покое? – Mildfire

+0

См. Изменения в моем ответе. – JodyT

Смежные вопросы