Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用Oracle 11查询数据_Sql_Oracle_Sql Standards - Fatal编程技术网

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进行聚合,仅保留最大日期与客户最大日期匹配的组
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;

提示:
ROW\u NUMBER()
客户注册状态划分,按日期降序排列。您的示例结果是错误的这是一个非常合理的问题,描述得不好。OP似乎想要最新状态出现的第一个日期。@OP:我不知道戈登·林诺夫是如何破译这个问题的。但是如果他是对的,那么在您的结果中,第二行的
Customer\u ID
值应该是
ABC
,不是吗?考虑修改你的帖子以减少混乱(有点)。抱歉!我把结果弄错了。