sql - 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 条记录
解决方案
您想使用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 SELLING_RETAIL 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<>在这里摆弄
推荐阅读
- php - 从 PHP 中的数组中获取特定值
- xamarin.forms - Xamarin 表单集合视图额外填充
- java - 如何在截止日期调用 grpc blockstub 时管理应用程序崩溃
- angular - Angular httpClient - RXJS 用法
- python - 如何将参数传递给python中的映射器函数?
- php - 需要使用 WordPress 按钮触发 Linux 后端脚本
- python - 如何使用 plyer(或 pyjnius)为 Kivy 应用程序获取 android 上的当前位置数据?
- windows - 远程运行ps命令
- javascript - MediaDevices:是否可以检测设备的麦克风是否静音?
- reactjs - 每次在 ReactJs 中重新渲染组件时都会重置实例变量