oracle - 使用 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 A
Sap 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 的单行最新记录。
解决方案
如果您ID
使用序列生成唯一值并且您的流程保证插入的顺序遵循预期的ID_OD
//层次结构RRH
,Tenancy
那么您可以绕过层次结构并使用:
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
推荐阅读
- android - Webview 与混合应用
- postgresql - 使用 Docker/Docker compose 运行 Postgres 迁移
- google-sheets - 按列 B 和 C 对列 A 分区进行排序的数组公式
- hibernate - 非主键之间的休眠关系OneToMany
- google-cloud-platform - 我可以将 Dataflow 作业配置为单线程吗?
- google-chrome - 如何使 Chrome 警告弹出“您的密码可能被泄露”消失
- c# - 使用 ASP.NET C# 在 SQL Server 中存储和查看图像
- android - 将数据从 ACTIVITY 传递到 FRAGMENT 不适合我
- react-native - ReactNavigation headerRight 按钮不起作用
- python - 使用 Matplotlib 在图中打印 .txt 文件