Разница в работе в SQL - PullRequest
3 голосов
/ 07 января 2011

У меня есть таблица Excel, которая легко рассчитывает разницу по формуле:

      A             B           C
1    date        status    timeInStatus 
2    12/26/2010  Good      N/A
3    12/27/2010  Bad       24.00      << =(A3-A2)*24
4    12/28/2010  Not-Good  24.00      << =(A4-A3)*24

используется для вычисления разницы в датах как своего рода промежуточный итог. (очевидно, пример прост, но в ячейках реальной даты также есть время.)

Таким образом, в этом примере легко увидеть, что 24 часа были потрачены в состоянии «Хорошо», 24 - в состоянии «Плохо», а состояние «Не хорошо» все еще активно.

У меня есть эквивалентная таблица в Access, в которой есть столбцы equipmentId, date и status. Что я хотел бы сделать с ним, это создать запрос, который делает то же самое, что и в примере выше. Просто подсчитайте время в каждом статусе, чтобы ответить на вопрос «Сколько времени я провел в данном статусе?» Проблема в том, что я почти уверен, что это потребует какой-то магии подзапроса, которая у меня над головой. Есть идеи?

Спасибо заранее.

1 Ответ

2 голосов
/ 07 января 2011

Это действительно зависит от того, как структурированы ваши данные.Это все, что держит таблица?

Всегда ли за статусом следует следующий статус, т. Е. Статус с ключом n активен до начала статуса с ключом n + 1?

Если это так, вам нужно присоединитьсяверните таблицу на key = key - 1 и затем вычислите разницу в датах.

SELECT
    t1.B as Status,
    t1.A as StartDate,
    t2.A as EndDate
FROM
    Table t1 
    LEFT OUTER JOIN Table t2 ON t1.Key = t2.Key - 1

edit: я пропустил часть о сумме.Таким образом, вы суммируете приведенный выше результат в Status, суммируя значения различий в датах следующим образом:

SELECT
    t1.B as Status,
    SUM(DATEDIFF(h, t2.A, t1.A)) as TotalTime
FROM
    Table t1 
    LEFT OUTER JOIN Table t2 ON t1.Key = t2.Key - 1
GROUP BY t1.B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...