抱歉,如果標題問題不清楚,我想以前有人問過這個問題,但我已經搜索了一段時間,我認為我的措辭不是特別好。
我有一個通話記錄表,我們在其中記錄通話被保留或從保留中接聽的時間。該callid列是我們參考特定呼叫的方式——它不是唯一的記錄 ID,因此callid當呼叫處于保留狀態或未保留狀態時,有多個相同的條目。我們將該資訊記錄在該answered列中,該列包含 0 表示呼叫處于保持狀態,或 1 表示被接聽。
我試圖找出有人被擱置然后在再次接聽電話之前掛斷的情況;也就是說,該特定項的最后一次出現應該在列callid中具有 0 。answered我從這個查詢開始:
SELECT * from table t1
WHERE NOT EXISTS(
SELECT 1 from table t2
WHERE t1.callid = t2.callid
HAVING COUNT(CASE WHEN answered = 1 THEN 1 END)
)
order by id desc
但是,這不包括呼叫被保持,在某個時間應答,然后在呼叫者掛斷之前再次保持的情況。在這些情況下,我們將有三個相同的記錄,列中callid有 0 -> 1 -> 0 answered。我能想到的最好方法是找到相同的記錄,callid其中列中 0 的條目數answered大于 1 的條目數。由此產生兩個問題:
- 有沒有更好的方法來考慮這個查詢?
- 我將如何去尋找那個特定的場景?我想我需要做一些計數和比較,但我還沒有找到可行的方法。謝謝,如果有任何需要澄清,請隨時告訴我。
uj5u.com熱心網友回復:
編輯:answered = 0在子查詢之外更新。
ROW_NUMBER()將成為你的朋友。您可以使用它來確定特定 callid 的最后一個條目= 0的所有場景。我假設每個發生的事件都有一些時間戳。
SELECT
*
FROM (
SELECT
callid
,... --Other columns needed
,ROW_NUMBER() OVER (PARTITION BY callid ORDER BY <timestamp column> DESC) AS rn --Order descending so the latest entry = 1
FROM t1
) as calls
where calls.rn = 1
and answered = 0
uj5u.com熱心網友回復:
由于記錄總是交替為 0、1、0、1、0 等,因此最后一個操作將被擱置的呼叫(即 0)將具有奇數行。
查找具有奇數的行:
SELECT * from table t1
WHERE EXISTS (
SELECT 1 from table t2
WHERE t1.callid = t2.callid
HAVING COUNT(*) % 2 = 1
)
ORDER BY id DESC
或者作為一個連接,它會表現更好:
SELECT t2.*
FROM (
SELECT callid
from table
GROUP BY callid
HAVING COUNT(*) % 2 = 1
) t1
JOIN table t2 ON t2.callid = t1.callid
ORDER BY id DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457349.html
下一篇:為什么結果顯示某些等級值為空
