ограничить количество записей, возвращаемых в sql-запросе

#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