oJM*_*86o 3 t-sql 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,
)
Run Code Online (Sandbox Code Playgroud)
我必须每晚清空该表...但根据按字段PolledAt分组的字段保留最大行LoginID。这意味着一个用户 (LoginID) 具有多行,到晚上结束时,该用户在删除后应该只有一行。该行应该是MAX(PolledAt)值。
我可以通过以下方式获取我不想删除的记录:
SELECT
LoginID,
MAX(PolledAt) AS MaxPolledAt
FROM
Poll
GROUP BY
LoginID
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何形成我的删除,因为我没有显示主键,即 pollid。我需要获取上述选择的结果并删除除该选择返回的内容之外的所有内容。
您可以使用公共表表达式和row_number()函数来确定需要删除哪些行。
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);
Run Code Online (Sandbox Code Playgroud)
查询1:
with C as
(
select row_number() over(partition by LoginID order by PolledAt desc) as rn
from Poll
)
delete from C
where rn > 1;
Run Code Online (Sandbox Code Playgroud)
结果:
查询2:
select *
from Poll;
Run Code Online (Sandbox Code Playgroud)
结果:
| POLLID | LOGINID | FACILITYID | POLLEDAT |
-------------------------------------------------------------------
| 4 | 1 | 1 | February, 08 2013 21:48:34+0000 |
| 5 | 2 | 2 | February, 09 2013 21:48:34+0000 |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2978 次 |
| 最近记录: |