0

以下是问题陈述:

我有一个数据库表,其中的条目看起来像(这是虚构的表:-)):

Company    Customer ID         Date          

Amazon            1         2012-08-30      
Amazon            2         2012-09-30
Amazon            2         2012-09-1
amazon            2         2012-12-10
eBay              1         2012-03-10
eBay              10        2012-01-01
BananaR           1         2012-02-20  
BananaR           1         2012-02-28
BananaR           1         2012-05-10
BananaR           1         2012-05-25

现在,此表中的每个条目都表示为在线交易完成的安全检查。所以第一行意味着“对于客户 ID 1,亚马逊在 2012 年 8 月 30 日为交易进行了在线安全检查”。

因此,我需要计算在第一次安全检查之后每个月对同一客户和公司组合进行多少次额外的安全检查。IE

对于客户 2,亚马逊在 2012 年 9 月 1 日进行了第一次检查,然后额外的检查将在 2012 年 9 月 30 日和 2012 年 12 月 10 日进行。所以预期的答案是:

Company      CustomerID     Month            Additional checks
Amazon          1            2012-08               0
Amazon          2            2012-09               1
Amazon          2            2012-12               1
eBay            1            2012-03               0
eBay            10           2012-01               0
BananaR         1            2012-02               1
BananaR         1            2012-05               2

自每月进行第一次检查以来,我现有的查询输出用于额外检查,但我不知道我是否可以回溯到前几个月。所以我的查询看起来像:

select company as 'Company',
       customer_id as 'Customer',
       format_date as 'Month',
       (add_count-1) as 'Additioanl Checks'
  from (select count(*) as add_count,
               company,
               customer_id,
               to_char(date, 'yyyy-mm') as format_date
          from my_table
          group by company, customer_id, format_date)

现在得到的结果是:

Company      Customer         Month       Additional Checks
Amazon         1               2012-08         0
Amazon         2               2012-09         1
**Amazon       2               2012-12         0**
eBay           1               2012-03         0
eBay           10              2012-01         0
BananaR        1               2012-02         1
**BananaR      1               2012-05         1**

** 中的行不正确,因为它们计算的是每月的额外检查,而不是因为前几个月完成了第一次检查。

4

2 回答 2

3

如果我正确理解了您的逻辑,您想从第一个月的计数中减去 1,而不是随后的几个月。这是一种方法:

select Company,
       Customer,
       to_char(date, 'yyyy-mm') as month,
       count(*) - (case
                     when to_char(min(MinDate), 'yyyy-mm') = to_char(date, 'yyyy-mm')
                     then 1
                     else 0
                   end)
  from (select t.*,
               min(date) over (partition by company, customer) as MinDate
          from t) t
  group by Company, Customer, to_char(date, 'yyyy-mm')
于 2012-09-10T20:47:37.867 回答
2
10:27:57 HR@vm_xe> l                                                              
  1  select company                                                               
  2         ,customer_id                                                          
  3         ,mon                                                                  
  4         ,sum(sign(rn-1)) cnt                                                  
  5  from (                                                                       
  6    select company                                                             
  7           ,customer_id                                                        
  8           ,to_char(dt, 'yyyy-mm') mon                                         
  9           ,row_number() over(partition by company, customer_id order by dt) rn
 10      from security_checks                                                     
 11  )                                                                            
 12  group by company, customer_id, mon                                           
 13* order by company, customer_id                                                
10:27:57 HR@vm_xe> /                                                              

COMPANY         CUSTOMER_ID MON            CNT                                    
--------------- ----------- ------- ----------                                    
Amazon                    1 2012-08          0                                    
Amazon                    2 2012-09          1                                    
Amazon                    2 2012-12          1                                    
BananaR                   1 2012-02          1                                    
BananaR                   1 2012-05          2                                    
eBay                      1 2012-03          0                                    
eBay                     10 2012-01          0                                    

7 rows selected.                                                                  

Elapsed: 00:00:00.01                                  
于 2012-09-11T02:29:58.440 回答