顧客プロファイルの変更を追跡するテーブルがあります。簡略化されたバージョンは次のとおりです。
CREATE TABLE HISTORY (
CUSTOMER_ID NUMBER(9,0),
DATE_CHANGED DATE,
ACCOUNT_TYPE VARCHAR2(20),
CONSTRAINT HISTORY_PK PRIMARY KEY (CUSTOMER_ID, DATE_CHANGED)
);
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (200, TO_DATE('05/01/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Premium');
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (300, TO_DATE('17/02/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Free');
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (100, TO_DATE('05/03/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Free');
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (100, TO_DATE('12/03/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Standard');
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (200, TO_DATE('22/03/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Standard');
INSERT INTO HISTORY (CUSTOMER_ID, DATE_CHANGED, ACCOUNT_TYPE) VALUES (100, TO_DATE('29/03/2013 00:00:00','DD/MM/RRRR HH24:MI:SS'), 'Premium');
そのデータは第三者によって維持されます。私の最終的な目標は、特定の期間におけるアカウントの種類と月ごとの顧客の合計を取得することですが、ここではもっと簡単なことから始めたいと思います。変更が記録されている月と顧客の組み合わせごとに最新のアカウントの種類を表示します。 :
YEAR MONTH CUSTOMER_ID ACCOUNT_TYPE
==== ===== =========== ============
2013 1 200 Premium
2013 2 300 Free
2013 3 100 Premium
2013 3 200 Standard
ここでは、顧客 100 が 3 月に 3 つの変更を行いました。3月が最新なので「プレミアム」と表示しています。
すべての行を取得するクエリは次のようになります。
SELECT EXTRACT(YEAR FROM DATE_CHANGED) AS YEAR,
EXTRACT(MONTH FROM DATE_CHANGED) AS MONTH,
CUSTOMER_ID, ACCOUNT_TYPE
FROM HISTORY
ORDER BY YEAR, MONTH, CUSTOMER_ID, DATE_CHANGED
集計関数を使用して不要な行を除外することは可能ですか? 分析関数を使用する方が理にかなっていますか?
(そして、どちらの場合でも、適切な機能は何でしょうか?)
編集:不要な行の例を求められました。3 月の顧客 100 には 3 つの行があります。
'05/03/2013 00:00:00', 'Free'
'12/03/2013 00:00:00', 'Standard'
'29/03/2013 00:00:00', 'Premium'
不要な行は'Free'
、'Standard'
その月の最新ではないためです。