首页 > 解决方案 > 使用 Oracle 从表中获取最新记录

问题描述

我有一个要求,每次我插入相同的记录时SAP-ID

例如:-

         A Sap ID, first time I Insert -> ID/OD then
         A Sap ID, Second time I Insert --> RRH then
         A Sap ID, third time I Insert --> Tenancy.

因此,每次我插入新行时,对于 Single ASap ID。

但我想要的是,在获取数据时,我想要一条记录中所有列中的最新。

表名是TBL_IPCOLO_BILLING_MST

下面是表的说明。

Name                          Null     Type           
----------------------------- -------- -------------- 
ID                            NOT NULL NUMBER         
CMP                                    NVARCHAR2(100) 
SAP_ID                                 NVARCHAR2(100) 
ID_OD_COUNTCHANGE                      NVARCHAR2(100) 
ID_OD_CHANGEDDATE                      DATE           
RRH_COUNTCHANGE                        NVARCHAR2(100) 
RRH_CHANGEDDATE                        DATE           
TENANCY_COUNTCHANGE                    NVARCHAR2(100) 
TENANCY_CHANGEDDATE                    DATE           
RFS_DATE                               DATE           
RFE1_DATE                              DATE           
INFRA_PROVIDER                         NVARCHAR2(100) 
IP_COLO_SITEID                         NVARCHAR2(100) 
SITE_NAME                              NVARCHAR2(500) 
R4GSTATE                               NVARCHAR2(100) 
MW_INSTALLED                           NVARCHAR2(100) 
DG_NONDG                               NVARCHAR2(100) 
EB_NONEB                               NVARCHAR2(100) 
TOWER_TYPE                             NVARCHAR2(100) 
VENDOR_CODE                            NVARCHAR2(100) 
RFCDATE                                DATE           
POLITICAL_STATE_NAME                   NVARCHAR2(100) 
POLITICAL_STATE_CODE                   NVARCHAR2(100) 
SITE_DROP_DATE                         DATE           
CITY_NAME                              NVARCHAR2(100) 
NEID                                   NVARCHAR2(100) 
FACILITY_LATITUDE                      NVARCHAR2(100) 
FACILITY_LONGITUDE                     NVARCHAR2(100) 
RJ_STRUCTURE_TYPE                      NVARCHAR2(100) 
RJ_JC_NAME                             NVARCHAR2(100) 
RJ_JC_CODE                             NVARCHAR2(100) 
COMPANY_CODE                           NVARCHAR2(100) 
BLCHAIN_RESP_MSG_MASTER                NVARCHAR2(100) 
BLCHAIN_RESP_CODE_MASTER               NVARCHAR2(100) 
SITE_ADDRESS                           CLOB           
BLCHAIN_RESP_MSG_INCREMENTAL           VARCHAR2(100)  
BLCHAIN_RESP_CODE_INCREMENTAL          VARCHAR2(100)  
CREATED_BY                             NVARCHAR2(100) 
CREATED_DATE                           DATE           
SEL_CHANGED_VAL                        NVARCHAR2(100) 

这是它的样子。

表信息

请建议我怎样才能得到这个。

更新

因此,对于插入的三行,我想获得一条记录,其中包含单个 sap id 的三个记录中的所有最新记录。

编辑后我尝试了MTO答案

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY SAP_ID
           ORDER BY ID DESC
         ) AS rn
  FROM   TBL_IPCOLO_BILLING_MST t
)
WHERE rn = 1
AND SAP_ID = 'I-MU-MUMB-ENB-I595';

但我得到了IDOD,RRH为空。下面是截图

毫米

我想要 IDOD、RRH 和 Tenancy 的所有数据,以及单个 sapid 的单行最新记录。

标签: oraclegreatest-n-per-group

解决方案


如果您ID使用序列生成唯一值并且您的流程保证插入的顺序遵循预期的ID_OD//层次结构RRHTenancy那么您可以绕过层次结构并使用:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY SAP_ID
           ORDER BY ID DESC
         ) AS rn
  FROM   TBL_IPCOLO_BILLING_MST t
)
WHERE rn = 1

如果要使用层次结构,则:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY SAP_ID
           ORDER BY CASE
                    WHEN tenancy_changeddate IS NOT NULL THEN 1
                    WHEN rrh_changeddate     IS NOT NULL THEN 2
                    WHEN id_od_changeddate   IS NOT NULL THEN 3
                    ELSE 4
                    END,
                    COALESCE( tenancy_changeddate, rrh_changeddate, id_od_changeddate ) DESC,
                    ID DESC
         ) AS rn
  FROM   TBL_IPCOLO_BILLING_MST t
)
WHERE rn = 1

更新

您似乎不想要最新的“行”,但想要从不同的“最新”行的组合中提取数据,所以您想要类似的东西:

SELECT MAX( id ) KEEP (
         DENSE_RANK LAST
         ORDER BY tenancy_changeddata NULLS FIRST,
                  rrh_changed_date    NULLS_FIRST,
                  id_od_changeddate   NULLS FIRST
       ) AS id,
       MAX( cmp ) KEEP (
         DENSE_RANK LAST
         ORDER BY tenancy_changeddata NULLS FIRST,
                  rrh_changed_date    NULLS_FIRST,
                  id_od_changeddate   NULLS FIRST,
                  id
       ) AS cmp,
       SAP_ID,
       MAX( ID_OD_CHANGECOUNT ) KEEP (
         DENSE_RANK LAST
         ORDER BY id_od_changeddate   NULLS FIRST,
                  id
       ) AS id_od_changecount,
       MAX( ID_OD_CHANGEDDATE ) AS id_od_changeddate,
       MAX( RRH_CHANGECOUNT ) KEEP (
         DENSE_RANK LAST
         ORDER BY rrh_changeddate   NULLS FIRST,
                  id
       ) AS rrh_changecount,
       MAX( RRH_CHANGEDDATE ) AS rrh_changeddate,
       MAX( TENANCY_CHANGECOUNT ) KEEP (
         DENSE_RANK LAST
         ORDER BY tenancy_changeddate   NULLS FIRST,
                  id
       ) AS tenancy_changecount,
       MAX( TENANCY_CHANGEDDATE ) AS tenancy_changeddate
       -- repeat for other columns as per CMP
FROM   TBL_IPCOLO_BILLING_MST
GROUP BY sap_id

推荐阅读