Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 用分组方式删除_Tsql_Sql Server 2005 - Fatal编程技术网

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 |