删除与分组依据

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。我需要获取上述选择的结果并删除除该选择返回的内容之外的所有内容。

Mik*_*son 5

您可以使用公共表表达式row_number()函数来确定需要删除哪些行。

SQL小提琴

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)