2013-02-05 17 views
2

表...但留下基礎上,PolledAt場由LoginID領域細分電子郵件最大行。這就意味着用戶(登錄ID)具有多行,在晚上結束該用戶應該只有刪除後一排。該行應該是MAX(PolledAt)的值。具有以下</p> <pre><code>CREATE TABLE [dbo].[Poll]( [PollID] [bigint] IDENTITY(1,1) NOT NULL, [LoginID] [bigint] NOT NULL, [FacilityID] [bigint] NOT NULL, [PolledAt] [datetime] NOT NULL, ) </code></pre> <p>我必須清空該表進行夜間DELETE與GROUP BY

我能得到我不記錄要刪除與此:

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

但我不知道如何形成我刪除,因爲我不顯示主鍵這是pollid。我需要採取上述選擇的結果,並刪除除了選擇返回的所有內容。

回答

4

您可以使用Common Table Expressionrow_number()功能找出行有什麼需要被刪除。

SQL Fiddle

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; 

Results

查詢2

select * 
from Poll; 

Results

| POLLID | LOGINID | FACILITYID |      POLLEDAT | 
------------------------------------------------------------------- 
|  4 |  1 |   1 | February, 08 2013 21:48:34+0000 | 
|  5 |  2 |   2 | February, 09 2013 21:48:34+0000 | 
相關問題