SQL-запрос, чтобы найти следующий статус и получить время между ними - PullRequest
1 голос
/ 01 мая 2019

Я спорю с запросом sql в bigquery, у меня есть таблица с несколькими номерами билетов вместе со всеми остальными данными из билетов. Я пытаюсь выяснить, кто длинный билет сидит в определенном состоянии.

Мои данные выглядят так:

TicketNumber | Дата обновления | Государство | Примечания .....

Я пытаюсь получить это:

TicketNumber | Дата обновления | Государство | NextState | DateChanged

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

SELECT distinct allinc.TicketNumber as inc, allinc.state, DateChanged, allinc.TicketNumber, nextupdate
FROM `incidents` allinc
left outer join (
select *, CAST(DateUpdated AS datetime) as DateChanged, state as DateChanged from `incidents`
) resinc
on allinc.TicketNumber = resinc.TicketNumber and CAST(resinc.DateChanged AS datetime) > CAST(allinc.TicketNumber AS datetime) 
where allinc.state = 'Awaiting User' 
order by inc

Конечная цель - получить общее время, в течение которого билет был установлен в «Ожидание пользователя», но это может быть несколько раз для каждого билета.

Любой совет был бы великолепен.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Я бы предложил сначала нормализовать ваш стол. Я думаю, что будет лучше, если ticket_details будет на одном столе, а ticket_states будет на другом.

ticket_details (PK TicketNumber, other_details)

ticket_state (PK TicketNumber, PK DateCreated, DateUpdated, State)

Таким образом, определенный билет может иметь столько состояний, сколько необходимо. Что касается изменения состояния, вы можете вставить новую запись в ticket_states с тем же TicketNumber, и DateCreated новой записи будет DateUpdated предыдущей записи.

Для запроса на получение общего времени, в котором он находится в заданном состоянии, например «Ожидание пользователя», вы, вероятно, можете сделать что-то вроде этого:

SELECT TicketNumber, State, SUM(DateDiff)
FROM
        (SELECT ticket_details.TicketNumber, ticket_state.State, DATEDIFF(DateUpdated,DateCreated) AS DateDiff FROM ticket_details
        LEFT JOIN ticket_state
        ON ticket_details.TicketNumber = ticket_state.TicketNumber) TableDetailState
WHERE State = 'Awaiting User'
GROUP BY TicketNumber
0 голосов
/ 01 мая 2019

Я думаю, что вы описываете lead():

select i.*,
       lead(state) over (partition by ticketnumber order by dateupdated) as next_state,
       lead(dateupdated) over (partition by ticketnumber order by dateupdated) as next_dateupdated
from incidents i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...