問題の説明は次のとおりです。
次のようなエントリを持つデータベーステーブルがあります(これは架空のテーブルです:-)):
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**
**の行は、前の月に最初のチェックが行われたためではなく、月ごとに追加のチェックをカウントしているため、正しくありません。