如何使用 Oracle 11 查询数据
How to query data with Oracle 11
我正在努力查询数据作为示例
----------
Date of Transaction Customer_ID Customer_Register_Status
20/09/2015 123 NEW
21/09/2015 123 Activate
22/09/2015 123 Activate
23/09/2015 123 Suspense
24/09/2015 123 Suspense
25/09/2015 123 Activate
26/09/2015 123 Activate
27/09/2015 123 Activate
28/09/2015 123 Activate
29/09/2015 123 Activate
30/09/2015 123 Activate
26/09/2015 123 Activate
27/09/2015 ABC NEW
28/09/2015 ABC NEW
29/09/2015 ABC NEW
30/09/2015 ABC NEW
01/09/2015 ABC NEW
02/09/2015 ABC NEW
我的愿望结果
Date of Transaction Customer_ID Customer_Register_Status
25/09/2015 123 Activate
27/09/2015 ABC NEW
规则是结果
- 使用客户Register_status必须显示最新状态
- 日期必须是更改最后状态的第一天
- 如果Customer_Register_Status永远不会更改显示必须显示交易的第一天
请指导我如何创建查询以获得结果
您想要最后状态的第一个日期。 . .即切换到最后状态的日期。
这是一种执行以下操作的方法:
- 在状态改变时创建一个标志。
- 对标志进行正向求和以创建
grp
以识别具有相同状态的相邻行。
- 计算每个客户的最大日期。
- 按客户和 grp 进行聚合,仅保留最大日期与客户最大日期匹配的组。
SQL是:
select t.customer_id, min(dte), status
from (select dte, customer_id, status,
sum(case when prev_status = status then 0 else 1 end) over (partition by customer_id) as statusgrp,
max(dte) over (partition by customer_id) as maxdte
from (select t.*,
lag(status) over (partition by customer_id order by dte) as prev_status
from table t
) t
) t
group by customer_id, statusgrp, status, maxdte
having max(dte) = maxdte;
我正在努力查询数据作为示例
----------
Date of Transaction Customer_ID Customer_Register_Status
20/09/2015 123 NEW
21/09/2015 123 Activate
22/09/2015 123 Activate
23/09/2015 123 Suspense
24/09/2015 123 Suspense
25/09/2015 123 Activate
26/09/2015 123 Activate
27/09/2015 123 Activate
28/09/2015 123 Activate
29/09/2015 123 Activate
30/09/2015 123 Activate
26/09/2015 123 Activate
27/09/2015 ABC NEW
28/09/2015 ABC NEW
29/09/2015 ABC NEW
30/09/2015 ABC NEW
01/09/2015 ABC NEW
02/09/2015 ABC NEW
我的愿望结果
Date of Transaction Customer_ID Customer_Register_Status
25/09/2015 123 Activate
27/09/2015 ABC NEW
规则是结果
- 使用客户Register_status必须显示最新状态
- 日期必须是更改最后状态的第一天
- 如果Customer_Register_Status永远不会更改显示必须显示交易的第一天
请指导我如何创建查询以获得结果
您想要最后状态的第一个日期。 . .即切换到最后状态的日期。
这是一种执行以下操作的方法:
- 在状态改变时创建一个标志。
- 对标志进行正向求和以创建
grp
以识别具有相同状态的相邻行。 - 计算每个客户的最大日期。
- 按客户和 grp 进行聚合,仅保留最大日期与客户最大日期匹配的组。
SQL是:
select t.customer_id, min(dte), status
from (select dte, customer_id, status,
sum(case when prev_status = status then 0 else 1 end) over (partition by customer_id) as statusgrp,
max(dte) over (partition by customer_id) as maxdte
from (select t.*,
lag(status) over (partition by customer_id order by dte) as prev_status
from table t
) t
) t
group by customer_id, statusgrp, status, maxdte
having max(dte) = maxdte;