SQL Server - преобразовать строку в истекшее время, вернуть максимальное значение - PullRequest
0 голосов
/ 05 октября 2019

У меня есть набор значений, таких как:

TrackUserId EventTime                 EventName     EventValue
---------------------------------------------------------------------
643812      2019-10-05 00:26:38.513   time.today    00:40:55.9443418
643806      2019-10-04 23:51:43.577   time.today    00:02:33.6620074
643806      2019-10-04 23:52:30.610   time.today    00:13:04.3645199

EventValue - это строка (база данных представляет собой пары имя-значение, где значение «тип» зависит от имени). Значения здесь являются продолжительностью, а не временем суток. Он может записывать продолжительность для определенного TrackUserId несколько раз в течение дня, причем каждое значение является продолжительностью этого дня до настоящего времени. Таким образом, значения продолжают увеличиваться.

Обратите внимание, что для TrackUserId = 643806 есть 2 записи, и в этом случае я хочу вторую, поскольку она имеет более длительную продолжительность.

Для данного TrackUserIdи EventTime день (т.е. по дате, а не по дате / времени), я хочу получить одну строку назад, строку с наибольшим прошедшим временем. Это возможно?

1 Ответ

0 голосов
/ 05 октября 2019

Похоже, вы хотите агрегировать:

select TrackUserId, EventTime, max(EventValue)
from t
where EventName = 'time.today'
group by TrackUserId, EventTime;

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

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

select t.*
from t
where t.EventName = 'time.today' and
      t.EventTime = (select max(t2.EventTime)
                     from t t2
                     where t2.TrackUserId = t.TrackUserId and
                           t2.EventName = 'time.today'
                    );

Вы можете настроить это для дня:

select t.*
from t
where t.EventName = 'time.today' and
      t.EventTime = (select max(t2.EventTime)
                     from t t2
                     where t2.TrackUserId = t.TrackUserId and
                           convert(date, t2.eventTime) = convert(date, t1.eventTime) and
                           t2.EventName = 'time.today'
                    );
...