2011-04-20 26 views
1

"select * from table;"以下の結果が得られます。 どのようにして各refについて最初の3つのレコードのみを表示するように制限できますか?SQLクエリで返されるレコードの数の制限

感謝のMicrosoft SQL Serverの2005+のために

ref other field 
---------------------- 
1234 a 
1234 b 
1234 c 
1234 d 
1234 e 
5678 a 
5678 b 
5678 c 
5678 d 
+5

。たとえば、MySQLはOracleとは異なる回答をします。 – Riggy

+0

私はMySQLで同じ問題があります。 –

答えて

2

SELECT ref, OtherField 
    FROM (SELECT ref, OtherField, 
       ROW_NUMBER() OVER(PARTITION BY ref ORDER BY OtherField) AS RowNum 
       FROM YourTable) t 
    WHERE t.RowNum <= 3 

同じクエリ、CTEを使用して:

オラクルで
WITH cteRowNum AS (
    SELECT ref, OtherField, 
      ROW_NUMBER() OVER(PARTITION BY ref ORDER BY OtherField) AS RowNum 
     FROM YourTable 
) 
SELECT ref, OtherField 
    FROM cteRowNum 
    WHERE RowNum <= 3 
+0

大変ありがとうございます – DarkW1nter

1

WITH subquery as 
(
    SELECT ref, row_number() over (partition by ref) rank, other_field 
    FROM my_table 
) 
SELECT ref, other_field from subquery where rank <= 3; 

ルックアップOracle analytic functions SQL Serverで動作します

+0

PostgreSQLとDB2にも同様に動作します –

0

別の解決策は、あなたは、DB、使用しているものを指定する必要があります2005+

Select ... 
From MyTable As T 
    Cross Apply (
       Select TOP 3 T2.OtherField 
       From MyTable As T2 
       Where T2.ref = T.ref 
       Order By T2.OtherField 
       ) As Z 
関連する問題