SQL批量标识某些记录,然后从SQLServer 2008中删除

时间:2015-06-24 07:38:06

标签: sql sql-server tsql sql-server-2008-r2

我有一个weatherForecast表。每小时插入大约700个邮政编码预测值。这些com通过三个webServices。一个在.40过去,.50过去和.55过去一小时。

除了遍历XML并将其插入我们的SQlServer 2008r2数据库的代码之外,这一切都正常工作,但是每小时都没有检查重复的邮政编码。副本被定义为一个邮政编码,它位于三个webServices中的一个以上。所以我已经解决了这个问题,我的问题是如何处理已经滑过的记录。

E.G postCode 6330在小时饲料的0.40和0.50分钟之内,因此它每小时有两个预测(很长一段时间,该表目前为900万个recods)。现在,我很容易删除这些记录。为了保持.40分钟过去的记录并删除0.50分钟,我想我可以这样做:

delete from Weather_Opticast_Forecast where lPostCode=6330 and datePart(minute, recordCreated) = '50'

或者任何人都可以看到这个问题。国际海事组织我认为可以肯定地说。过去的记录将会保留.40分钟,并且将删除.50分钟以后的记录会被删除吗?

我们知道有两个邮政编码。那些我们没有的。我是否必须编写代码来检测这些或SQL可以处理这个?我想要说的是,在每小时插入的700条记录(邮政编码)中,是否有任何在60分钟内插入的邮政编码的记录?

希望我已经清楚地解释了我的两个问题。使用纯SQL

处理这些记录的识别和删除是理想的

1 个答案:

答案 0 :(得分:1)

您可以在CTE中使用ROW_NUMBER()来识别每小时内的后续重复项,然后将其删除:

declare @t table (ID int not null,
                  CreatedAt datetime not null,
                  PostCode varchar(19) not null)
insert into @t (ID,CreatedAt,PostCode) values
(1,'2015-06-24T09:40:00',6884),
(2,'2015-06-24T09:51:00',6884),
(3,'2015-06-24T10:30:00',2117),
(4,'2015-06-24T10:30:01',2117),
(5,'2015-06-24T10:30:02',6884)

;With Selected as (
    select *,ROW_NUMBER() OVER (
                PARTITION BY
                            PostCode,
                            CONVERT(date,CreatedAt),
                            DATEPART(hour,CreatedAt)
                ORDER BY CreatedAt) as rn
    from @t
)
delete from Selected where rn > 1

select * from @t

结果:

ID          CreatedAt               PostCode
----------- ----------------------- -------------------
1           2015-06-24 09:40:00.000 6884
3           2015-06-24 10:30:00.000 2117
5           2015-06-24 10:30:02.000 6884