2009-07-23 8 views
2

Je veux conserver seulement 1000 entrées pour chaque client. Le code ci-dessous fait ce que je veux mais ne boucle pas le client, au lieu de 1000 au total des clients.Supprimer le bouclage SQL

Existe-t-il un moyen de faire cela en SQL? On m'a dit que j'avais besoin d'un curseur, mais j'espère que non.

DECLARE @ids TABLE (id int) 
DECLARE @clients TABLE (clientid varchar(20)) 

INSERT INTO @clients (clientid) 
SELECT select distinct clientid FROM tRealtyTrac 

INSERT INTO @ids (id) 
SELECT top 1000 id FROM tRealtyTrac WHERE clientid in (select clientid from @clients) 

DELETE trealtytrac WHERE id NOT IN (select id from @ids) 

Répondre

2

Est-ce SQL Server 2005 ou plus tard? Qu'en est-il de quelque chose comme

INSERT INTO @ids (id) 
SELECT id FROM (
    SELECT id, RANK() OVER (PARTITION BY clientid ORDER BY id) AS Rank FROM tRealtyTrac 
) t 
WHERE t.Rank <= 1000 
+0

Ça bouge! Je n'ai jamais utilisé de partition ou de rang avant. Merci edsoverflow. – Bryan

2

Oracle:

DELETE from CLIENTS 
where CLIENT_ID = 'xxx' and 
rownum > 1000 
1

Je pense que la réponse "dans Oracle" supprimera les entrées les plus récentes. Soyez prudent avec celui-là!

+0

(Celui de A Rashad où il utilise "rownum> 1000) –

Questions connexes