Tsql 用分组方式删除
表中包含以下内容:Tsql 用分组方式删除,tsql,sql-server-2005,Tsql,Sql Server 2005,表中包含以下内容: CREATE TABLE [dbo].[Poll]( [PollID] [bigint] IDENTITY(1,1) NOT NULL, [LoginID] [bigint] NOT NULL, [FacilityID] [bigint] NOT NULL, [PolledAt] [datetime] NOT NULL, ) 我必须每晚清空此表…但根据LoginID字段分组的PolledAt字段保留最大行数。这意味着一个用户(LoginID)
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
)
我必须每晚清空此表…但根据LoginID
字段分组的PolledAt
字段保留最大行数。这意味着一个用户(LoginID)有多行,到晚上结束时,该用户在删除后应该只有一行。该行应为MAX(PolledAt)
值
我可以通过以下方式获取我不想删除的记录:
SELECT
LoginID,
MAX(PolledAt) AS MaxPolledAt
FROM
Poll
GROUP BY
LoginID
但是我不知道如何形成我的删除,因为我没有显示主键pollid。我需要获取上述选择的结果并删除除选择返回的内容以外的所有内容。您可以使用和函数来确定需要删除哪些行
MS SQL Server 2008架构设置:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
查询1:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
查询2:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
您可以使用和函数确定需要删除哪些行
MS SQL Server 2008架构设置:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
查询1:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
查询2:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
:
CREATE TABLE [dbo].[Poll](
[PollID] [bigint] IDENTITY(1,1) NOT NULL,
[LoginID] [bigint] NOT NULL,
[FacilityID] [bigint] NOT NULL,
[PolledAt] [datetime] NOT NULL,
);
insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
select *
from Poll;
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |