Рассчитать промежуток времени за несколько записей - PullRequest
0 голосов
/ 01 октября 2018

У меня есть таблица, которая имеет следующую схему:

ID | FirstName | Surname | TransmissionID | CaptureDateTime
1  | Billy     | Goat    | ABCDEF         | 2018-09-20 13:45:01.098
2  | Jonny     | Cash    | ABCDEF         | 2018-09-20 13:45.01.108
3  | Sally     | Sue     | ABCDEF         | 2018-09-20 13:45:01.298
4  | Jermaine  | Cole    | PQRSTU         | 2018-09-20 13:45:01.398
5  | Mike      | Smith   | PQRSTU         | 2018-09-20 13:45:01.498

Есть более 70 000 записей, и они хранят журналы передач в веб-сервис.Что я хотел бы знать, так это как мне написать сценарий, который бы выбирал отдельные значения TransmissionID, а также отображал бы временной интервал между самой ранней CaptureDateTime записью и самой последней записью?По сути, я хотел бы посмотреть, какова скорость записи и чтения и записи веб-службы.

Возможно ли это сделать в одном выражении SELECT или мне нужно просто создать хранимую процедуру илисообщить в коде?Я не знаю, с чего начать, кроме SELECT DISTINCT TransmissionID для такого рода запроса.

Вот что у меня есть (я застрял в расчете времени)

SELECT DISTINCT [TransmissionID],
        COUNT(*) as 'Number of records'
  FROM [log_table]
  GROUP BY [TransmissionID]
  HAVING COUNT(*) > 1

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

TransmissionID | TimeToCompletion | Number of records |
ABCDEF         |            2.001 |             5000  |

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Используйте минимальное и максимальное значения для расчета временного интервала

SELECT [TransmissionID],
        COUNT(*) as 'Number of records',datediff(s,min(CaptureDateTime),max(CaptureDateTime)) as timespan
  FROM [log_table]
  GROUP BY [TransmissionID]
  HAVING COUNT(*) > 1
0 голосов
/ 01 октября 2018

Метод, который возвращает среднее время для всех transmissionids, даже тех, которые имеют только 1 запись:

SELECT TransmissionID,
    COUNT(*),
    DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime)) * 1.0 / NULLIF(COUNT(*) - 1, 0)
FROM yourdata
GROUP BY TransmissionID;

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

Если это так, это выглядит следующим образом:

SELECT TransmissionID,
    COUNT(*),
    DATEDIFF(second,
             MIN(CaptureDateTime),
             MAX(MAX(CaptureDateTime)) OVER ()
            ) * 1.0 / COUNT(*)
FROM yourdata
GROUP BY TransmissionID;
0 голосов
/ 01 октября 2018

Просто GROUP BY и используйте функцию MIN / MAX, чтобы найти минимальную / максимальную дату в каждой группе и вычесть их:

SELECT
    TransmissionID,
    COUNT(*),
    DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime))
FROM yourdata
GROUP BY TransmissionID
HAVING COUNT(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...