从一系列日期获取数据库中的值,该值不会出现在该日期范围之外

时间:2017-08-29 21:40:37

标签: sql oracle

我们的数据库存储呼叫数据,其中包含拨打电话的日期时间值以及用于呼叫的电话号码。我想知道如何才能获得在过去一小时内拨打电话的所有电话号码以及之前没有拨过电话的电话号码。我试图使用以下查询但没有成功:

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 个答案:

答案 0 :(得分:1)

您应该可以使用Common Table Expressions执行此操作。使用WITH()子句创建两个子查询。第一个将查看在过去一小时内呼叫的每个电话号码。第二个将使用聚合函数来计算特定数字之前的调用次数。

从那里,您从RecentCalls CTE中选择所有不同的电话号码,然后在WHERE子句中使用您的NOT IN (SELECT ... FROM CallTotals)语句从第二个表中排除计数为1的所有内容(&gt; 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)