SQL - столбец, содержащий текущую строку прошивки, основанную на случайных сообщениях на нескольких машинах - PullRequest
1 голос
/ 11 марта 2020

У меня есть таблица с именем SessionEvents.

SessionEvents

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

В настоящее время мой запрос SQL выглядит следующим образом. (Основано на ответе Адамламара в Как эффективно выбрать предыдущее ненулевое значение? с небольшими изменениями.)

Я использую JOIN, поскольку machine_id находится в связанной таблице с именем Сессии.

SELECT *,
    first_value(message_info) over (partition by value_partition order by event_time) as ColumnFirmware

FROM(        
SELECT SessionEvents.event_time, SessionEvents.message_type, SessionEvents.message_info, Sessions.machine_id,
    sum(case when message_type <> 1 then 0 else 1 end) over (partition by machine_id order by event_time) as value_partition

FROM SessionEvents
JOIN Sessions ON SessionEvents.SessionId=Sessions.Id) t
-- WHERE machine_id = 1

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

(Данные извлекаются из базы данных Azure SQL)

1 Ответ

1 голос
/ 11 марта 2020

Это проблема пробелов и островков. Сначала определите острова, затем выкладывайте прошивку:

SELECT s.*,
       MAX(CASE WHEN message_type = 1 THEN message_info
           END) OVER (PARTITION BY machine_id, seqnum - sequm_m
                     ) as firmware
FROM (SELECT se.event_time, se.message_type, se.message_info, s.machine_id,
             ROW_NUMBER() OVER (PARTITION BY machine_id ORDER BY event_time) as seqnum_m,
             ROW_NUMBER() OVER (ORDER BY event_time) as seqnum
      FROM SessionEvents se JOIN
           Sessions s
           ON se.SessionId = s.Id
      ) s
...