2

表如下

CREATE TABLE [dbo].[Poll](
    [PollID] [bigint] IDENTITY(1,1) NOT NULL,
    [LoginID] [bigint] NOT NULL,
    [FacilityID] [bigint] NOT NULL,
    [PolledAt] [datetime] NOT NULL,
)

我必须每晚清空这张表......但根据PolledAt字段分组的LoginID字段保留最大行。这意味着用户(LoginID)有多行,到晚上结束时,用户在删除后应该只有一行。该行应该是MAX(PolledAt)值。

我可以得到我不想删除的记录:

SELECT
    LoginID,
    MAX(PolledAt) AS MaxPolledAt
FROM
    Poll
GROUP BY
    LoginID

但后来我不知道如何形成我的删除,因为我没有显示作为 pollid 的主键。我需要获取上述选择的结果并删除除该选择返回的所有内容。

4

1 回答 1

4

您可以使用公用表表达式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);

查询 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;

结果

查询 2

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 |
于 2013-02-05T21:42:23.883 回答