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

これで、このテーブルの各エントリは、オンライントランザクションに対して実行されたセキュリティチェックを示します。したがって、1行目は、「顧客ID 1の場合、Amazonはトランザクションに対して2012-08-30にオンラインセキュリティチェックを実行した」ことを意味します。

したがって、最初のセキュリティチェックの後、毎月同じ顧客と会社の組み合わせに対して行われた追加のセキュリティチェックの数を把握する必要があります。すなわち

顧客2の場合、Amazonは2012-09-01に最初のチェックを行い、その後、追加のチェックは2012-09-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を引きたいが、それ以降の月はそうではない。これが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 に答える