使用分钟SQL进行分组

时间:2016-05-10 12:09:11

标签: sql oracle

这是一个非常典型的要求,我试图对该群体进行编码但不起作用

RegDate                    signupdate           channel ID      product 
09/05/2016 23:52:34 09/05/2016 23:55:06 Mobile     1            apple
09/05/2016 23:52:32 09/05/2016 23:52:45 Mobile     2            mango
09/05/2016 23:52:16                     Mobile     3            mango
09/05/2016 23:52:49                     Mobile     4            banana
09/05/2016 23:52:50                     Mobile     5            banana
09/05/2016 23:52:50 09/05/2016 15:52:45 Mobile     5            Kiwi

输出

Regdate       min     No.of Regs   No.of Signups  channel Product
09/05/2016   23:52      1           1              mobile  apple               
09/05/2016   23:52      2           1              mobile  mango               
09/05/2016   23:52      2                          mobile  banana 
09/05/2016   23:52      1                          mobile  Kiwi 

我当前的查询:

select  SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5),count(distinct ID),
       channel, product
from glance_REG_act_Prod_samp
group by SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5), source, reg_product

2 个答案:

答案 0 :(得分:0)

我认为您需要group by中的日期,而不是秒。这样做你想要的吗?

select TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI'), source, reg_product,
       count(distinct ID)
from glance_REG_act_Prod_samp
group by TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI'), source, reg_product;

注意:除非COUNT(*)的副本确实存在,否则您应该使用ID

答案 1 :(得分:0)

我认为这就是你所追求的:

with sample_data as (select to_date('09/05/2016 23:52:34', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 23:55:06', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 1 id, 'apple' product from dual union all
                     select to_date('09/05/2016 23:52:32', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 23:52:45', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 2 id, 'mango' product from dual union all
                     select to_date('09/05/2016 23:52:16', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 3 id, 'mango' product from dual union all
                     select to_date('09/05/2016 23:52:49', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 4 id, 'banana' product from dual union all
                     select to_date('09/05/2016 23:52:50', 'dd/mm/yyyy hh24:mi:ss') regdate, null signupdate, 'Mobile' channel, 5 id, 'banana' product from dual union all
                     select to_date('09/05/2016 23:52:50', 'dd/mm/yyyy hh24:mi:ss') regdate, to_date('09/05/2016 15:52:45', 'dd/mm/yyyy hh24:mi:ss') signupdate, 'Mobile' channel, 6 id, 'kiwi' product from dual)
select   to_char(regdate, 'dd/mm/yyyy') regdate,
         to_char(regdate, 'hh24:mi') min,
         count(*) num_of_regs,
         count(case when signupdate >= regdate then 1 end) num_signups,
         channel,
         product
from     sample_data
group by to_char(regdate, 'dd/mm/yyyy'),
         to_char(regdate, 'hh24:mi'),
         channel,
         product
order by product;

REGDATE    MIN   NUM_OF_REGS NUM_SIGNUPS CHANNEL PRODUCT
---------- ----- ----------- ----------- ------- -------
09/05/2016 23:52           1           1 Mobile  apple  
09/05/2016 23:52           2           0 Mobile  banana 
09/05/2016 23:52           1           0 Mobile  kiwi   
09/05/2016 23:52           2           1 Mobile  mango  

请注意,我假设id列是唯一的,而且您的最后一行id = 5的事实是错字。

我还假设猕猴桃产品的输出没有可用的注册计数的原因是因为注册日期在注册日期之前。你没有解释背后的逻辑,所以我不知道这是否是你预期输出的错字。您应该能够修改我的查询以输出您需要的任何结果(例如,case when signupdate is not null then 1 end?)。

此外,如果要显示空白而不是0,那么将输出更改为null而不是0,这是一个简单的CASE / DECODE;你的选择。

完全不谈,你正在做:SUBSTR(TO_CHAR(regdate, 'HH24:MI:SS'),1,5) ...为什么?你是从日期创建一个字符串,然后缩短它。为什么不按照您想要的格式从日期创建字符串?例如。 to_char(regdate, 'hh24:mi')