2

次のフィールドを含むワークログ テーブルがあります。

worklog_id,
agent_name,
ticket_number,
timestamp,
worklog_notes.  

作成された作業ログ エントリの数をカウントできるようにしたいと考えています。ここでagent_nameticket_numbertimestamp(日付) が同じ場合、2 つのエントリ間の時間が 1 時間を超える場合にのみ作業ログ エントリがカウントされます。

例: ジョン・スミスは、チケット 12345 で 3 つの作業ログ エントリを作成します。タイムスタンプは「10/11/2012 11:18:20 AM」です。この例では、最初の 2 つの作業ログ エントリの間隔が 1 時間未満だったため、2 つの作業ログ エントリに対してのみエージェントの功績を認めたいと考えています。

「where」サブクエリを使用してロジックを動作させようとしましたが、動作させることができません。誰かが彼らが提供できる例を持っていますか? ありがとう!:)

4

1 に答える 1

1

これはあなたが望むものを手に入れますか?チケットの特定のエージェントによる最初のエントリは常にカウントする必要があり、それ以降のエントリは、前のエントリから少なくとも1時間経過した場合にのみカウントする必要があります。

select agent_name, ticket_number, count(*) from (
  select agent_name, ticket_number, timestamp,
         lag(timestamp) over
            (partition by agent_name, ticket_number order by timestamp) prev_timestamp
  )
from worklog
where (prev_timestamp is null
       or (timestamp - prev_timestamp) >= interval '1' hour
      )
group by agent_name, ticket_number

これが正確にあなたが望むものであるかどうかはわかりません-エージェントが前のエントリから1時間以内にエントリを追加し続ける場合、最初のエントリを除いてそれらのどれもカウントされません。したがって、多くの更新を追加した人は罰せられます。

たぶん、あなたが本当に望んでいるのは、更新が行われた個別の時間数を数えることです。

select agent_name, ticket_number, count(distinct to_char(timestamp,'DD-MON-YYYY HH24')
  from worklog
  group by agent_name, ticket_number
于 2012-10-12T14:47:52.397 に答える