2011-04-20 85 views
1

如果“select * from table;”给出以下结果, 我怎样才能限制它只显示每个ref的前3条记录?sql查询返回的记录数限制

感谢

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

你需要指定DB你使用的是什么。例如,MySQL将有不同于Oracle的答案。 – Riggy 2011-04-20 13:42:53

+0

我对MySQL有同样的问题。 – 2016-01-13 05:46:16

回答

2

对于Microsoft SQL Server 2005+:

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 2011-04-20 13:48:25

1

借助Oracle:

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

+0

对于PostgreSQL和DB2也同样适用 – 2011-04-20 13:49:28

0

将在SQL Server的工作另一种解决方案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