Sql Oracle CTE/子查询分解删除
您好,我需要在Oracle SQL Developer上运行它,但它不工作。我有重复,我需要删除一个和另一个必须仍然在数据库中。Ofc并非都是重复的,它们也需要删除。我只需要一个id的最新行。使用 Oracle 11g R2架构设置: 问题1: :Sql Oracle CTE/子查询分解删除,sql,oracle,Sql,Oracle,您好,我需要在Oracle SQL Developer上运行它,但它不工作。我有重复,我需要删除一个和另一个必须仍然在数据库中。Ofc并非都是重复的,它们也需要删除。我只需要一个id的最新行。使用 Oracle 11g R2架构设置: 问题1: : WITH RemoveDate As ( SELECT table.*, ROW_NUMBER() OVER (PARTITION BY id order by row_added_dttm) AS RowNumber FROM table WHE
WITH RemoveDate As (
SELECT table.*, ROW_NUMBER()
OVER (PARTITION BY id order by row_added_dttm) AS RowNumber
FROM table
WHERE (grp = '124')
and row_added_dttm <= (SELECT MAX(row_added_dttm) from table
where (grp = '124') )
)
delete from RemoveDate where RowNumber >1
CREATE TABLE table_name ( id, row_added_dttm ) AS
SELECT 1, DATE '2017-09-20' FROM DUAL UNION ALL
SELECT 1, DATE '2017-09-19' FROM DUAL UNION ALL
SELECT 1, DATE '2017-09-18' FROM DUAL UNION ALL
SELECT 1, DATE '2017-09-17' FROM DUAL UNION ALL
SELECT 2, DATE '2017-09-20' FROM DUAL UNION ALL
SELECT 2, DATE '2017-09-18' FROM DUAL UNION ALL
SELECT 3, DATE '2017-09-15' FROM DUAL;
MERGE INTO table_name t
USING (
SELECT ROW_NUMBER() OVER ( PARTITION BY id ORDER BY row_added_dttm DESC )
AS RN,
ROWID AS rid
FROM table_name
) m
ON ( t.ROWID = m.ROWID )
WHEN MATCHED THEN
UPDATE SET id = id
DELETE WHERE m.RN > 1;
SELECT *
FROM table_name
| ID | ROW_ADDED_DTTM |
|----|----------------------|
| 1 | 2017-09-20T00:00:00Z |
| 2 | 2017-09-20T00:00:00Z |
| 3 | 2017-09-15T00:00:00Z |