相関サブクエリまたはウィンドウ関数なしで機能する別の方法は次のとおりです。
各行についてw1
、別の行を見つけてみてくださいw2
同じcall_idと0は、呼び出しが完了したことを示します。 LEFT OUTER JOINを使用して、w2
がない場合をテストできます。 指定されたcall_idに行が存在します。
次に、架空の行w3
に別の結合を行います 同じcall_idとより小さいast_num_curr値を使用します。ここでも、外部結合を使用して、そのような行が存在しないことを確認できます。これはw1
を意味します そのcall_idのastnumの値は最小である必要があります。
SELECT w1.call_id, w1.queue_num_curr
FROM waiter_log AS w1
LEFT OUTER JOIN waiter_log AS w2
ON w1.call_id = w2.call_id AND w2.proceed_wait = 0
LEFT OUTER JOIN waiter_log AS w3
ON w1.call_id = w3.call_id AND w1.ast_num_curr > w3.ast_num_curr
WHERE w2.call_id IS NULL AND w3.call_id IS NULL;
出力:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
queue_num_currごとのカウントを取得するには、上記のクエリを派生テーブルサブクエリでラップし、外部クエリでカウントを実行します。
SELECT queue_num_curr, COUNT(*) AS count
FROM (
SELECT w1.call_id, w1.queue_num_curr
FROM waiter_log AS w1
LEFT OUTER JOIN waiter_log AS w2
ON w1.call_id = w2.call_id AND w2.proceed_wait = 0
LEFT OUTER JOIN waiter_log AS w3
ON w1.call_id = w3.call_id AND w1.ast_num_curr > w3.ast_num_curr
WHERE w2.call_id IS NULL AND w3.call_id IS NULL
) AS t
GROUP BY queue_num_curr;
出力:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+