如何在同一行中显示手机号码和旧数据的最后状态?使用SQL

如何在同一行中显示手机号码和旧数据的最后状态?使用SQL,sql,oracle,Sql,Oracle,我在一家电信公司工作,部分工作是检查特定手机号码的最后状态以及最后的停用状态,使用语句中的条件active很容易获得活动号码,但选择最后一个停用状态并不容易,因为每个数字可能有多个停用状态或只有一个停用状态,我使用EXP_日期作为最后一个停用状态的指示器,我想在一行中显示新数据和旧数据,但我正在努力解决这个问题,在我的表格和预期结果下面:- 我的预期结果 我每天使用的查询 从测试中选择*,其中exp_date>sysdate;要获取活动电话号码,要获取非活动电话号码,请选择*from test

我在一家电信公司工作,部分工作是检查特定手机号码的最后状态以及最后的停用状态,使用语句中的条件active很容易获得活动号码,但选择最后一个停用状态并不容易,因为每个数字可能有多个停用状态或只有一个停用状态,我使用EXP_日期作为最后一个停用状态的指示器,我想在一行中显示新数据和旧数据,但我正在努力解决这个问题,在我的表格和预期结果下面:-

我的预期结果

我每天使用的查询


从测试中选择*,其中exp_date>sysdate;要获取活动电话号码,要获取非活动电话号码,请选择*from test where exp_date这里是如何执行此操作的概述-一个查询可获取所有电话号码的不同列表,左键连接到该电话号码上最近活动的列表,左键连接到电话号码上最近停用的列表

条件聚合如何

select msidn,
       max(case when status = 'DE-ACTIVE' then create_date end) as deactive_date,
       max(case when status = 'ACTIVE' then exp_date end) as active_date
from test 
group by msisdn
您只需使用包含活动记录的子查询和包含最新非活动记录的子查询进行外部联接,如下所示:

SELECT A.MSISDN, 
A.NAME, 
A.SUB_STATUS,
A.CREATED_DATE, 
A.EXP_DATE,
D.MSISDN AS MSISDN_, 
D.NAME AS OLD_NAME, 
D.SUB_STATUS OLD_STATUS, 
D.CREATED_DATE AS OLD_CREATED_DATE, 
D.EXP_DATE AS OLD_EXP_DATE
FROM
(SELECT * FROM TEST 
    WHERE EXP_DATE > SYSDATE
     AND SUB_STATUS = 'ACTIVE') A -- ACTIVE RECORD 
     -- USE CONDITION TO FETCH ACTIVE RECORD AS PER YOUR REQUIREMENT
FULL OUTER JOIN 
(SELECT * FROM
    (SELECT T.*, 
    ROW_NUMBER() OVER (PARTITION BY T.MSISDN ORDER BY EXP_DATE DESC NULLS LAST) AS RN
    FROM TEST T 
   WHERE T.EXP_DATE < SYSDATE
     AND T.SUB_STATUS='DE-ACTIVE') 
     -- USE CONDITION TO FETCH DEACTIVE RECORD AS PER YOUR REQUIREMENT
 WHERE RN = 1
) D
ON (A.MSISDN = D.MSISDN)

干杯

请显示用于获取结果的SQL查询。选择*from test,其中exp\u date>sysdate;要获取活动号码,要获取非活动号码,请选择*from test where exp_dateThank,这意味着我必须上传一个表中的号码列表,我们称之为mobile_numbers,然后在另一个表中左键连接第一个查询活动号码,然后在第二个查询中左键连接非活动号码,但请稍候,我将如何获取每个号码的最后一个停用状态?每个号码都可能有多个非活动状态我需要基于EXP_日期的最后一个号码。您使用group BYES我同意group by认为这会有帮助,我会尝试。我尝试了group by,乍一看这似乎是个好主意,但尝试后它会返回相同号码的重复记录,因为它将按名称分组,sub_状态,create_date,exp_date,我认为学习PL/SQL时应该考虑到这一点,以避免复杂性。@OsamaAl Banna-您不应该按所有列分组然后将其返回到表中以获取其余的列。。。twicegordon在我的回答中看到OP关于exp date的评论。@gardon谢谢,我也会尝试你的答案,我现在没有DB访问权限,明天我会尝试所有场景。@OsamaAl Banna-记住你对deactive使用了不同的日期,所以它看起来是这样的:当状态为'DE-ACTIVE'时,maxcase,然后exp\U date结束为deactive_date@Hogan . . . 感谢您的澄清。顺便说一下,我在Oracle中将联接类型从外部联接更改为完全外部联接。是的,我的意思是仅完全外部联接!!但当我在手机浏览器上给出答案时,我错过了。不管怎样,用完整的外部连接更新了答案。你能解释一下第二个查询是如何工作的吗?按T.MSISDN顺序按EXP_DATE DESC NULLS LAST AS RN划分的行数,行数?,按T.MSISDN划分的行数,NULLS LAST?它会给每一行编号。对于分区中的每个MSISDNas,数字将重新启动,并且数字将按照EXP_日期的降序给出。