2012-04-18 5 views
0

У меня 2 следующие таблицы:Нужна помощь в создании запроса в SQL?

Ticket(ID, Problem, Status,Priority, LoggedTime,CustomerID*, ProductID*); 
TicketUpdate(ID,Message, UpdateTime,TickedID*,StaffID*); 

Вот вопрос, чтобы ответить:

Закрыть все опорные билеты, которые не были обновлены в течение по крайней мере 24 часов. Это будут записи, которые получили по крайней мере одно обновление от сотрудника и никаких дополнительных обновлений от клиента (или сотрудника) в течение как минимум 24 часов.

Мой запрос:

UPDATE Ticket SET Status = 'closed' FROM TicketUpdate 
WHERE(LoggedTime - MAX(UpdateTime))> 24 
    AND Ticket.ID = TicketUpdate.TicketID; 

Когда я запускаю этот запрос на MySQL он говорит, что «<» не существует.

Можете ли вы сказать мне, что мой запрос подходит для расчета записей, которые не были обновлены в течение как минимум 24 часов, и если это правильно, что мне следует использовать вместо «<»?

+0

Какой тип данных является столбцом UpdateTime? Это дата или время? – Tim

+0

Это временная метка – BlackOctober

+0

Возможный дубликат ваших предыдущих вопросов http://stackoverflow.com/questions/10195759/need-some-help-in-creating-a-query-in-sql и http://stackoverflow.com/ Вопросы/10192521/need-some-help-in-create-a-query-in-sql – halfer

ответ

0

... записей, которые получили по крайней мере одно обновление от сотрудника и , дальнейшие обновления от клиента (или сотрудника) не менее 24 часов.

Таким образом, последнее обновление должно быть выполнено сотрудниками и должно быть старше 24 часов. Это покрывает все это.

(Кстати, у вас есть опечатка: TickedID -> Я использую ticketid здесь.)

UPDATE ticket t 
SET status = 'closed' 
FROM (
    SELECT DISTINCT ON (1) 
      ticketid 
      ,first_value(updatetime) OVER w AS last_up 
      ,first_value(staffid) OVER w AS staffid 
    FROM ticketupdate 
    -- you could join back to ticket here and eliminate 'closed' ids right away 
    WINDOW w AS (PARTITION BY ticketid ORDER BY updateTime DESC) 
    ) tu 
WHERE tu.ticketid = t.id 
AND tu.last_up < (now()::timestamp - interval '24 hours') 
AND tu.staffid > 1 -- whatever signifies "update from a staff member" 
AND t.status IS DISTINCT FROM 'closed'; -- to avoid pointless updates 

Обратите внимание, что PostgreSQL складывает identifiers to lower case, если не двойные кавычки. Я советую держаться подальше от идентификаторов смешанных случаев.

+0

Это ответ от профессионала !!! Это работает Эрвин! Большое спасибо! ;-) – BlackOctober

0

Если вы работаете с PostGreSQL то это должно работать

UPDATE Ticket SET Status = 'closed' FROM TicketUpdate 
WHERE abs(extract(epoch from LoggedTime - MAX(UpdateTime))) >24 
    AND Ticket.ID = TicketUpdate.TicketID; 
+0

Я не могу использовать DATEDIFF, так как у меня нет дня в столбце. Тип данных для UpdateTime - timestamp – BlackOctober

+0

@BlackOctober. См. Edit. – Marshal

+0

не может использовать функцию агрегата в UPDATE. LINE 2: WHERE abs (extract (epoch from LoggedTime - MAX UpdateTime))) – BlackOctober

Смежные вопросы