|
我有一张可以跟踪客户数据变化的表格。这是一个简化版本:$ @! M' I2 y- P' {, [! q$ a
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_DATE05/01/2013 00:00DD/MM/RRRR HH24:MI:SS'),'Premium');INSERT INTO HISTORY (CUSTOMER_ID,DATE_CHANGED,ACCOUNT_TYPE) VALUES (300,TO_DATE(17/02/2013 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,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,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,'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,DD/MM/RRRR HH24:MI:SS'),'Premium');该数据由第三方维护。我的最终目标是在给定的时间范围内按帐户类型和月份获得客户总数,但到目前为止,我想从更简单的方法开始-* g" ?5 f3 R% e8 u+ Z9 O! y
最新的账户类型记录显示在变化的每个月/客户组合中:0 g. ~; O7 @2 v+ Q3 z) m- Y
YEAR MONTH CUSTOMER_ID ACCOUNT_TYPE==== ===== =========== ============2013年 1 20000 20000Premium2013年 2 30000 300003000Free2013年 3 10000 10000Premium2013 3 200 Standard在这里,客户100在3月份进行了三次变更;我们展示高级,因为它在3月份有最新日期。
" u* A9 {3 w9 r: W获取 所有 行查询将如下:* y( f8 k- j: _( }4 A
SELECT EXTRACT(YEAR FROM DATE_CHANGED) AS YEAR,EXTRACT(MONTH FROM DATE_CHANGED) AS MONTH,CUSTOMER_ID,ACCOUNT_TYPEFROM HISTORYORDER BY YEAR,MONTH,CUSTOMER_ID,DATE_CHANGED聚合函数可以过滤掉不必要的行吗?使用分析函数更有意义吗? r1 [- s# ` ~2 _
(而且,在任何情况下,适当的功能是什么?3 p, P" o7 B1 P+ X( i1 H6 y
编辑: 我被要求提供不必要的行示例。3月,客户100有3行:
; P1 f' y! ?) Y$ {' j'05/03/2013 00:00Free12/03/2013 00:00Standard'29/03/2013 00:00Premium'不需要的行是Free','Standard因为这个月不是最新的行。) r+ q l5 f. Z
; T% i; ?4 g; |' A- U7 { 解决方案: |
|