2013-02-05 2 views
2

Table avec les éléments suivantsSUPPRIMER avec le groupe par

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

Je dois vider cette table à la nuit ... mais laissez la ligne maximale en fonction du champ PolledAt par le champ groupped LoginID. Signification un utilisateur (LoginID) a plusieurs lignes, à la fin de la nuit cet utilisateur ne devrait avoir qu'une seule ligne après la suppression. Cette ligne doit être la valeur MAX(PolledAt).

Je peux obtenir les dossiers que je ne veux supprimer avec ceci:

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

Mais alors je ne sais pas comment former ma suppression parce que je ne suis pas l'affichage de la clé primaire qui est le pollid. J'ai besoin de prendre le résultat de la sélection ci-dessus et supprimer tout sauf ce que select retourne.

Répondre

4

Vous pouvez utiliser une fonction Common Table Expression et la fonction row_number() pour déterminer les lignes à supprimer.

SQL Fiddle

MS SQL Server 2008 Configuration du schéma:

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); 

Requête 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:

Query 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 |