日期:2014-05-17  浏览次数:20851 次

oracle有条件删除重复数据
现在oracle数据库有张表,数据如下。如何用一条SQL语句,删除重复数据,注册时间在1分钟之内的数据,都算重复数据。
姓名,学号,注册时间
张三,201111,2012-11-20 09:50:10
张三,201111,2012-11-20 09:50:15
张三,201111,2012-11-20 09:52:15
李四,201112,2012-11-20 10:30:50
李四,201112,2012-11-20 10:31:10

------最佳解决方案--------------------
来了~!改之~!!

SELECT XM,XH,SJ FROM(
SELECT 
TO_CHAR(TO_DATE(SJ, 'YYYY-MM-DD HH24:MI:SS'), 'MISS') - 
TO_CHAR(TO_DATE(min(SJ) keep (DENSE_RANK first ORDER BY SJ) over(partition by XH), 'YYYY-MM-DD HH24:MI:SS'), 'MISS') AS FLG
,XM,XH,SJ,ROW_NUMBER()over(partition by XH ORDER BY SJ) as RN FROM TEST)
WHERE RN= 1 OR FLG >60
------其他解决方案--------------------
delete * from table where now-1注册时间<1;
------其他解决方案--------------------
WITH TEST AS (
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:50:10' SJ FROM DUAL
UNION ALL
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:50:15' SJ FROM DUAL
UNION ALL
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:52:15' SJ FROM DUAL
UNION ALL
SELECT '李四' AS XM,'201112' AS XH ,'2012-11-20 10:30:50' SJ FROM DUAL
UNION ALL
SELECT '李四' AS XM,'201112' AS XH ,'2012-11-20 10:31:10' SJ FROM DUAL
)
SELECT XM,XH,SJ FROM(
SELECT NVL(TO_CHAR(TO_DATE(SJ, 'YYYY-MM-DD HH24:MI:SS'), 'MISS') -
       TO_CHAR(TO_DATE(LAG(SJ, 1) over(partition by XH order by SJ),
                       'YYYY-MM-DD HH24:MI:SS'),
               'MISS'),0) AS FLG,
       XM,
       XH,
       SJ
  FROM TEST)
  WHERE FLG<60
------其他解决方案--------------------
上面的貌似有问题,现在改之~!

WITH TEST AS (
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:50:10' SJ FROM DUAL
UNION ALL
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:50:15' SJ FROM DUAL
UNION ALL
SELECT '张三' AS XM,'201111' AS XH ,'2012-11-20 09:52:15' SJ FROM DUAL
UNION ALL
SELECT '李四' AS XM,'201112' AS XH ,'2012-11-20 10:30:50' SJ FROM DUAL
UNION ALL
SELECT '李四' AS XM,'201112' AS XH ,'2012-11-20 10:31:10' SJ FROM DUAL
)
SELECT XM,XH,SJ FROM(
SELECT 
TO_CHAR(TO_DATE(SJ, 'YYYY-MM-DD HH24:MI:SS'), 'MISS') - 
TO_CHAR(TO_DATE(min(SJ) keep (DENSE_RANK first ORDER BY SJ) over(partition by XH), 'YYYY-MM-DD HH24:MI:SS'), 'MISS') AS FLG,XM,XH,SJ FROM TEST)
WHERE FLG =0 OR FLG >60