2017-08-29 71 views
1

我們的數據庫存儲調用數據的,與當調用與用於撥打的電話號碼一起做的日期時間值。我想知道我怎麼能得到的所有,都使得過去一小時內的呼叫和以前沒有進行呼叫的電話號碼。我嘗試使用下面的查詢,但沒有成功:獲得價值沒有出現之外的日期範圍

select distinct(calling_number) 
from calldb.call_logs 
where call_started >= sysdate-1/24 
and calling_number not in 
(
select distinct(calling_number) 
from calldb.call_logs 
where call_started < sysdate-1/24 
) 

的,我想什麼實例來完成: 假設數據庫具有以下數據和當前時間爲上午2:30

calling_number call_started 
9497587364  1:24 am 
5719389402  1:25 am 
7418320194  1:33 am 
7584729818  1:34 am 
9497587364  1:36 am 

其結果將是

7418320194  
7584729818  

因爲這兩個這些數字顯示在過去一小時內,並在數據庫中還沒有出現之前。任何意見非常感謝。

+1

當您嘗試查詢您分享的內容時發生了什麼?它應該產生正確的答案。 – mathguy

+0

@mathguy結果是空的。我認爲查詢出了問題,因爲我幾乎肯定應該有一些匹配的結果,但也許我錯了 – mgamez

+0

'calling_number'是否可以是'NULL'?不要猜測,找出通過運行一個小的查詢:從call_logs'SELECT COUNT(*),其中calling_number是null'。這是一種會使'不在'選擇錯誤的數據。 (如果你要求某個東西不在列表中,並且列表包含NULL,那麼你不能保證你所比較的東西不在列表中,因爲NULL可以是任何東西。) – mathguy

回答

1

你應該能夠與通用表表達式來做到這一點。使用WITH()子句創建兩個子查詢。第一個將查看在最近一小時內呼叫的每個電話號碼。第二個將使用聚合函數來計算特定數字之前做過多少次呼叫。

從那裏,你選擇所有從RecentCalls CTE您不同的電話號碼,然後在WHERE子句中使用NOT IN (SELECT ... FROM CallTotals)語句從具有計數1(> 1,則意味着他們已經叫你的第二個表排除一切之前)。

WITH RecentCalls AS (
    SELECT calling_number 
    FROM calldb.call_logs 
    WHERE calling_number IS NOT NULL AND call_started >= sysdate - 1/24), 
CallTotals AS (
    SELECT calling_number, COUNT(calling_number) AS call_count 
    FROM calldb.call_logs 
    WHERE calling_number IS NOT NULL 
    GROUP BY calling_number) 
SELECT DISTINCT calling_number 
FROM RecentCalls 
WHERE calling_number NOT IN (SELECT calling_number FROM CallTotals WHERE call_count = 1) 
相關問題