#sql
#sql
Вопрос:
если «select * from table;» выдает приведенные ниже результаты, как я могу ограничить его отображением только первых 3 записей для каждой ссылки?
Спасибо
ref other field
----------------------
1234 a
1234 b
1234 c
1234 d
1234 e
5678 a
5678 b
5678 c
5678 d
Комментарии:
1. Вам нужно будет указать, какую базу данных вы используете. Ответ MySQL будет отличаться от ответа Oracle, например.
2. У меня такая же проблема с MySQL.
Ответ №1:
Для 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
Ответ №2:
С 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.
Комментарии:
1. Также работает для PostgreSQL и DB2
Ответ №3:
Другое решение, которое будет работать в 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