2016-06-14 9 views
1

私は50 000レコードの一時テーブルを持っています。私はCOUNTで、GROUP BYを行う場合は、次のようになります。一時テーブル - グループ別 - 削除 - トップ10を維持

+--------+--------+ 
|GrpById | Count | 
+--------+--------+ 
| 1  | 10000 | 
| 2  | 8000 | 
| 3  | 12000 | 
| 4  | 9000 | 
| 5  | 11000 | 
+--------+--------+ 

私は10を持っているでしょう各IDの(1,2,3,4,5)からので、私は、いくつかのレコードを削除したいです削除後に残ったレコード。

+--------+--------+ 
|GrpById | Count | 
+--------+--------+ 
| 1  | 10 | 
| 2  | 10 | 
| 3  | 10 | 
| 4  | 10 | 
| 5  | 10 | 
+--------+--------+ 

私はそれがFETCH NEXTせずに行うことができます。

だから結局、私はCOUNTで新しいGROUP BYを作りたい場合、私はこのような何かを持っているでしょうか?

+1

トップ10場合はすべての値に対して上記のクエリをお試しください! Martinの答えは最後の文です。 –

答えて

3

はちょうどあなたが少なく、任意の何かが必要な場合は、グループごとに任意の10あなたは

WITH CTE AS 
(
SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY GrpById ORDER BY GrpById) AS RN 
FROM YourTable 
) 
DELETE FROM 
CTE WHERE RN > 10; 

変更ORDER BYを使用することができます保持するには。

+0

ありがとう:)あなたは ";"を忘れてしまった:-) – Ash

+1

@AshはスタンドアロンステートメントとしてSQL Serverでは必須ではありません。答えのコードはそれなしで正常に実行されます。前のステートメントが '; 'で終わるのを確実にする必要があります。 –

+1

私は冗談を言っていました:-)助けてくれてありがとう – Ash

0
declare @id int; 
declare @count int; 
set @id =1; 
select @count=count(1) from table where id = @id 

delete top(@count-10) from table where id = @id 

ものによってソートID変数@idで

関連する問題