Sql 如何使用Oracle 11查询数据
我正在努力以查询数据为例Sql 如何使用Oracle 11查询数据,sql,oracle,sql-standards,Sql,Oracle,Sql Standards,我正在努力以查询数据为例 ---------- 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
----------
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
规则是结果
- “使用客户注册”状态必须显示最新状态
- 日期必须是更改最后状态的第一个日期
- 如果客户注册状态为“永不更改”,则必须在交易的第一个日期显示
请指导我如何创建查询以获取结果您想要最后状态的第一个日期。即切换到最后状态的日期 以下是一种执行以下操作的方法:
- 在状态更改时创建标志
- 对标志进行正向求和以创建
,以标识具有相同状态的相邻行grp
- 计算每个客户的最长日期
- 按客户和grp进行聚合,仅保留最大日期与客户最大日期匹配的组
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;
提示:
ROW\u NUMBER()
按客户注册状态划分,按日期降序排列。您的示例结果是错误的这是一个非常合理的问题,描述得不好。OP似乎想要最新状态出现的第一个日期。@OP:我不知道戈登·林诺夫是如何破译这个问题的。但是如果他是对的,那么在您的结果中,第二行的Customer\u ID
值应该是ABC
,不是吗?考虑修改你的帖子以减少混乱(有点)。抱歉!我把结果弄错了。