如果“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
如果“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
对于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
太好了,非常感谢 – DarkW1nter 2011-04-20 13:48:25
借助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;
对于PostgreSQL和DB2也同样适用 – 2011-04-20 13:49:28
将在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
你需要指定DB你使用的是什么。例如,MySQL将有不同于Oracle的答案。 – Riggy 2011-04-20 13:42:53
我对MySQL有同样的问题。 – 2016-01-13 05:46:16