Oracle SQL - 根据条件删除记录子集

伊姆兰·赫曼尼

我有下表

ITEM    LOCATION    EFFECTIVE_DATE  SELLING_RETAIL
00139259    11001   01-JUL-20           2
00139259    11001   08-OCT-19           1
00139259    11001   04-OCT-19           1
00139259    11001   01-JAN-18           2
00139259    11001   04-DEC-17           1
00139259    11001   02-MAR-17           500

我只需要根据降序保留项目、位置和生效日期的三个记录。

以便我留在:

ITEM    LOCATION    EFFECTIVE_DATE  SELLING_RETAIL
00139259    11001   01-JUL-20           2
00139259    11001   08-OCT-19           1
00139259    11001   04-OCT-19           1

其余的都应该删除。

表中有很多项目和位置,我需要为项目/位置的组合保留3条记录

MT0

您想使用ROW_NUMBER分析函数查找最新三行之后的行,然后DELETE使用ROWID伪列语句相关联

DELETE FROM table_name
WHERE ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT ROW_NUMBER() OVER (
             PARTITION BY item, location ORDER BY effective_date DESC
           ) AS rn
    FROM   table_name
  )
  WHERE  rn > 3
)

其中,对于您的示例数据:

CREATE TABLE TABLE_NAME ( ITEM, LOCATION, EFFECTIVE_DATE, SELLING_RETAIL ) AS
SELECT '00139259', 11001, DATE '2020-07-01', 2 FROM DUAL UNION ALL
SELECT '00139259', 11001, DATE '2019-10-08', 1 FROM DUAL UNION ALL
SELECT '00139259', 11001, DATE '2019-10-04', 1 FROM DUAL UNION ALL
SELECT '00139259', 11001, DATE '2018-01-01', 2 FROM DUAL UNION ALL
SELECT '00139259', 11001, DATE '2017-12-04', 1 FROM DUAL UNION ALL
SELECT '00139259', 11001, DATE '2017-03-02', 500 FROM DUAL;

然后删除后:

SELECT * FROM table_name;

输出:

项目 位置 EFFECTIVE_DATE 销售_零售
00139259 11001 2020-07-01 00:00:00 2
00139259 11001 2019-10-08 00:00:00 1
00139259 11001 2019-10-04 00:00:00 1

db<>在这里摆弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章