2

我有一个包含数据的表,其中一列包含一个存储为文本的数字。当应用程序更新它时,它会_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.

所以没有删除行,一切都很好,没有错误,但是有了它,我得到了这个错误。我查了资料,应该没有问题。

这里发生了什么?

4

2 回答 2

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 小提琴

于 2013-02-14T15:00:19.360 回答
0

我认为您可以使用分组而不是窗口函数:

SELECT  max(id), max(sitenummer)
FROM    vdfkraan
group by left(sitenummer,charindex('_BAK',sitenummer));
于 2013-02-16T12:55:22.173 回答