我有一个包含数据的表,其中一列包含一个存储为文本的数字。
当应用程序更新它时,它会在数字后面写入_BAK
+日期时间戳。
我现在正在尝试通过删除数字列中_BAK
的所有记录来清理数据库,这些记录中不得删除最新的记录。
id sitenummer
28376 1441_BAK20130213151952032
28377 1441_BAK20130214142314705
在这种情况下,ID为28376的行是最早的行,必须删除。
我创建了一个应该执行此操作的查询:
;with sel1 AS (
select t1.ID,t1.sitenummer, CONVERT(BIGint,SUBSTRING(t1.sitenummer,CHARINDEX('_',t1.sitenummer,0)+4,50)) as Stamp1
from vdfkraan as t1
where t1.sitenummer like '%_BAK%' and (SELECT COUNT(SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) FROM vdfkraan as t2
where SUBSTRING(t1.sitenummer,0,CHARINDEX('_',t1.sitenummer,0))=SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) > 1
group by t1.id,t1.sitenummer)
, sel2 AS (
select t3.id, t3.sitenummer, t3.stamp1,
(select TOP(1) t4.stamp1 from sel1 as t4
WHERE SUBSTRING(t4.sitenummer,0,CHARINDEX('_',t4.sitenummer,0)) =SUBSTRING(t3.sitenummer,0,CHARINDEX('_',t3.sitenummer,0))
order by t3.Stamp1 DESC) AS stamp2 from sel1 as t3)
, sel3 AS (select id from sel2 where Stamp1=stamp2)
--delete FROM vdfkraan
--where id IN (SELECT t1.id FROM sel3 as t1)
--select * from sel2
如果我取消注释最后一行(从sel2中选择*),它会生成下表:
id sitenummer stamp1 stamp2
28376 1441_BAK20130213151952032 20130213151952032 20130213151952032
28377 1441_BAK20130214142314705 20130214142314705 20130213151952032
表sel3
包含一个记录,其中一列id = 28376
。
所以这似乎就像我想要的那样。
现在我评论选择行并取消注释删除行。
现在我收到以下错误:
Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to bigint.
所以没有删除行,一切都没问题,没有错误,但有了它,我得到了这个错误。 我检查了数据,应该没有任何问题。
这里发生了什么?
答案 0 :(得分:2)
试试这个:
SELECT v.ID
, v.sitenummer
, ROW_NUMBER() OVER (PARTITION BY LEFT(v.sitenummer, PATINDEX('%_BAK%', v.sitenummer) - 1) ORDER BY v.id DESC) num
INTO #temp
FROM vdfkraan v
WHERE PATINDEX('%_BAK%', v.sitenummer) > 0
DELETE vdfkraan
FROM #temp t
JOIN vdfkraan v ON v.id = t.id
AND t.num <> 1
SELECT *
FROM vdfkraan
这是 SQL Fiddle
答案 1 :(得分:0)
我认为您可以使用分组而不是窗口功能:
SELECT max(id), max(sitenummer)
FROM vdfkraan
group by left(sitenummer,charindex('_BAK',sitenummer));