简体   繁体   English

如何在Oracle SQL中基于天进行计数查询

[英]How to do a count query based on a day in oracle sql

I was looking to find out how I can write a count query based on a user and day. 我一直在寻找如何根据用户和日期编写计数查询的方法。 For example if I have the following data: 例如,如果我有以下数据:

Agent      | Date_1
Joe Bloggs | 06-jun-16 10:35:00
Joe Bloggs | 06-jun-16 10:36:00
Joe Bloggs | 06-jun-16 10:46:00
Joe Bloggs | 07-jun-16 09:36:00

I have been able to write the following: 我已经能够写出以下内容:

My current query is the following: 我当前的查询如下:

SELECT
    AGENT
   ,DATE_1 
   ,ROW_NUMBER() OVER (PARTITION BY AGENT ORDER BY DATE_1) AS COUNT_1    
FROM
    TABLE_1 
    ;

This gives a sequential count for every row based on my data. 这会根据我的数据对每一行进行顺序计数。 But I would like to show a count of only 1 for 06-jun-16 as the user is the same as well as the date, but I'm not sure how I can get that. 但是我只想显示16年6月6日的计数,因为用户和日期相同,但是我不确定如何获得该计数。 What I would like is: 我想要的是:

Agent Name | Date_1     | Count_1
Joe Bloggs |  06-jun-16 | 1
Joe Bloggs |  07-jun-16 | 1

The following is my create table and insert statement for my table: 以下是我的表的创建表和插入语句:

CREATE TABLE TABLE_1   
   (      
"AGENT" VARCHAR2(12 BYTE),   
"DATE_1" DATE  
   );

Insert Statement 插入语句

Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 09:47:23','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:07:47','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:16:48','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:32:31','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:33:35','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 10:49:20','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 11:14:17','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 14:08:13','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  
Insert into TABLE_1 (AGENT,DATE_1) values ('Joe Bloggs',to_date('07-JUN-16 15:31:05','DD-MON-RR HH24:MI:SS'));  

From the above data I am looking to count all the touches that are greater than 30 mins as a single count, anything that falls in between the 30 minute period doesn't increment the count. 从以上数据中,我希望将大于30分钟的所有触摸都计为一次计数,如果介于30分钟之间的任何时间都不会增加计数。

From my data the first touch was 09:47:23 so that starts off as 1, second unique touch was 10:07:47 (based on next date period) which was roughly 20 mins later so count stays at 1, now looking at the 3rd distinct time, this was at 10:16:48 which was 9 mins later from the previous so the count would still stay as 1. 根据我的数据,第一次接触是09:47:23,因此开始时是1,第二次独特接触是10:07:47(基于下一个日期周期),大约20分钟后,所以计数保持为1,现在来看第三个不同时间,该时间是10:16:48,比前一个时间晚9分钟,因此计数仍保持为1。

So in effect its a rolling 30 minute count based on the previous timestamp, if its below 30 mins count stays the same as previous if its greater count goes up by 1... 因此,实际上,如果前一个时间戳记少于30分钟,则其滚动的30分钟计数与前一个时间戳相同,如果较大的计数增加1,则与前一个时间戳相同。

Hopefully that makes more sense. 希望这更有意义。

This will give you the result you specify, a count of thirty minute windows for each combination of agent and date. 这将为您提供您指定的结果,对于座席和日期的每种组合,都有30分钟的窗口计数。

select agent
       , trunc(date_1) as date_1
       , sum(intvl)+1 as count_1
from (
    SELECT 
        AGENT
       , DATE_1
       , case when date_1 >= lag(date_1) over (partition by agent order by date_1)
             + to_dsinterval('0 0:30:0') 
          then 1 else 0 end as intvl
    FROM
        TABLE_1
   )
group by agent
       , trunc(date_1)
order by 1, 2
/

The LAG() analytic function allows us to compare the current value of DATE_1 with the preceding one, which is augmented with an INTERVAL() of thirty minutes to test the required window. LAG()分析函数使我们能够将DATE_1的当前值与前一个值进行比较,然后将其增加30分钟的INTERVAL()以测试所需的窗口。 Truncation removes the time element from the DATE_1 column, giving one result per day. 截断从DATE_1列中删除时间元素,每天给出一个结果。

Its simple.just write a outer select statement like below: 它的simple.just只需编写一个外部选择语句,如下所示:

select a.* 
    from 
    (SELECT
        AGENT
       ,DATE_1 
       ,ROW_NUMBER() OVER (PARTITION BY AGENT ORDER BY DATE_1) AS COUNT_1    
    FROM
        PROJECT ) a
    where a.COUNT_1  = 1    ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM