0

次の2つのテーブルがあります。

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

ここに答えられるべき質問があります:

24時間以上更新されていないすべてのサポートチケットを閉じます。これは、スタッフから少なくとも1回の更新を受け取り、少なくとも24時間は顧客(またはスタッフ)からそれ以上の更新を受け取らなかったレコードになります。

私の質問は:

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

このクエリをmysqlで実行すると、「<」が存在しないと表示されます。

少なくとも24時間更新されていないレコードを計算するための私のクエリの権利は教えていただけますか?それが正しい場合は、「<」の代わりに何を使用すればよいですか?

4

2 に答える 2

0

postgreSQLを使用している場合、これは機能するはずです

UPDATE Ticket SET Status = 'closed' FROM TicketUpdate 
WHERE abs(extract(epoch from LoggedTime - MAX(UpdateTime))) >24
     AND Ticket.ID = TicketUpdate.TicketID;
于 2012-04-18T10:31:33.527 に答える
0

...スタッフメンバーから少なくとも1回の更新を受け取り、少なくとも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は、二重引用符で囲まれていない場合、識別子を小文字に折りたたむことに注意してください。そもそも大文字と小文字が混在する識別子には近づかないことをお勧めします。

于 2012-04-18T13:35:19.860 に答える