SQL 批量识别某些记录,然后从 SQLServer 2008 中删除
SQL to bulk identify certain records and then delete from SQLServer 2008
我有天气预报table。每小时大约插入 700 post 个代码值的预测。它们通过三个网络服务进入。一个在过去 .40,过去 .50 和过去 .55。
除了我的代码遍历 XML 并将其插入我们的 SQlServer 2008r2 数据库之外,这一切工作正常,没有每小时检查重复的 post 代码。重复定义为 post 代码,它在三个 web 服务中不止一个。所以我已经解决了这个问题,我的问题是关于如何处理漏掉的记录。
E.G post代码 6330 在每小时 0.40 和 0.50 分钟内,因此它每小时有两个预报(很长一段时间,table 目前为 9万记录)。现在我很容易删除这些记录。要保留过去的 .40 分钟记录并删除 .50 分钟,我想我可以这样做:
delete from Weather_Opticast_Forecast where lPostCode=6330 and datePart(minute, recordCreated) = '50'
或者任何人都可以看到这方面的问题。 IMO 我认为可以肯定地说过去 .40 分钟的记录将保留而过去 .50 分钟的记录将被删除?
我们知道有两个 post代码。那些我们不知道的呢?我是否必须编写代码来检测这些或者 SQL 可以处理这个?我想说的是,在每小时插入的 700 条记录(post 代码)中,是否有任何 post 代码的记录是在 60 分钟内插入的?
希望我已经清楚地解释了我的两个问题。最好用纯SQL
来处理这些记录的识别和删除
您可以在 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
我有天气预报table。每小时大约插入 700 post 个代码值的预测。它们通过三个网络服务进入。一个在过去 .40,过去 .50 和过去 .55。
除了我的代码遍历 XML 并将其插入我们的 SQlServer 2008r2 数据库之外,这一切工作正常,没有每小时检查重复的 post 代码。重复定义为 post 代码,它在三个 web 服务中不止一个。所以我已经解决了这个问题,我的问题是关于如何处理漏掉的记录。
E.G post代码 6330 在每小时 0.40 和 0.50 分钟内,因此它每小时有两个预报(很长一段时间,table 目前为 9万记录)。现在我很容易删除这些记录。要保留过去的 .40 分钟记录并删除 .50 分钟,我想我可以这样做:
delete from Weather_Opticast_Forecast where lPostCode=6330 and datePart(minute, recordCreated) = '50'
或者任何人都可以看到这方面的问题。 IMO 我认为可以肯定地说过去 .40 分钟的记录将保留而过去 .50 分钟的记录将被删除?
我们知道有两个 post代码。那些我们不知道的呢?我是否必须编写代码来检测这些或者 SQL 可以处理这个?我想说的是,在每小时插入的 700 条记录(post 代码)中,是否有任何 post 代码的记录是在 60 分钟内插入的?
希望我已经清楚地解释了我的两个问题。最好用纯SQL
来处理这些记录的识别和删除您可以在 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