2011-01-04 6 views
3

私はテーブル次の表にSQL Server 2000:異なるフィールドごとにトップ10を取得する方法。ループかもしれない?

MyTable 
    ID 
    MessageType 
    MessageDate 
    MessageBody 

を持っているが、数万行あるだけで100ユニークMessageTypeのはそれです。

私が必要とするのは、各MessageType(少なくともMessageTypeとMessageBodyを含む必要があります)のサンプルですが、DISTINCTはMessageType列しか取得できません。

私は、これはそれがちょうど私のトップ5のように動作しません知っているが、私はこれを介してSQLループを作る方法を確認していない

SELECT TOP 5 * 
FROM MyTable 
WHERE MessageType IN (SELECT DISTINCT MessageType FROM MyTable) 

のようなものを考えています。私が正しくあなたの答えを読んでいる場合は任意のヘルプ

+2

はるかに簡単。 'TOP'は何から注文? –

+0

これは1回限りのレポートなので、テーブルをSQL 2008 DBにインポートできます。 by order by、それは問題ではありません。私は各MessageTypeのうちの5つを必要とします。 – InsertOldUserIDHere

+0

答えは実際にそのバージョンのSQL Serverに適用されないので、[sql-server-2000]タグをこれから削除するように頼むことはできますか? – Martha

答えて

2

ROW_NUMBERバージョン

;WITH cte AS 
(
SELECT ID, 
    MessageType, 
    MessageDate, 
    MessageBody, 
    ROW_NUMBER() OVER (PARTITION BY MessageType ORDER BY (SELECT 0)) AS RN 
FROM MyTable 
) 
SELECT ID, 
    MessageType, 
    MessageDate, 
    MessageBody 
FROM cte 
WHERE RN <=5 

CROSS APPLYバージョン

WITH m1 AS 
(
SELECT DISTINCT MessageType 
FROM MyTable 
) 

SELECT m2.* 
FROM m1 
CROSS APPLY 
(
SELECT TOP 5 * 
FROM MyTable m2 
WHERE m2.MessageType = m1.MessageType 
) m2 
+0

良いもの。私はあなたのデータ配信のためのより効率的かもしれないが、私のインターネット接続が再生を開始した2番目のバージョンを追加しようとしていた! –

2

マーティンのため

おかげで、私はあなたが生成されます何だと思います各メッセージの5つのサンプル。 Marc_sは、各メッセージから1つのサンプルを取得するだけです。私は何が必要だと思う

です: `CROSS APPLY`や` ROW_NUMBER`とそれ以降のバージョンで

SELECT ID, 
     MessageType, 
     MessageDate 
FROM (
    SELECT ID, 
      MessageType, 
      MessageDate, 
      ROW_NUMBER() OVER (PARTITION BY MessageType, ORDER BY NEWID()) AS RN 
     -- I am using NewID() because it will produce a nice random sampling, 
     -- but Mark's SELECT(0) will be faster. 
    FROM MyTable 
    ) sampling 
WHERE RN =1 
+0

+1なぜ私はあなたがそれを考えているのか分かりますが、タイトルは彼らがグループあたりトップ1以上のものを望んでいることを示しており、コメントで明確になっています。 –

+0

ああ、私はおそらくもっと徹底的に読むべきです:) – Ben

関連する問題