Как выбрать n-ую строку в таблице базы данных SQL? - PullRequest
353 голосов
/ 19 августа 2008

Мне интересно изучить некоторые (в идеале) независимые от базы данных способы выбора n -ой строки из таблицы базы данных. Также было бы интересно увидеть, как этого можно достичь, используя встроенную функциональность следующих баз данных:

  • SQL Server
  • MySQL
  • PostgreSQL
  • 1012 * SQLite *
  • Oracle

В настоящее время я делаю что-то вроде следующего в SQL Server 2005, но мне было бы интересно увидеть более независимые подходы других:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

Кредит для вышеуказанного SQL: Веблог Firoz Ansari

Обновление: См. Ответ Троэльса Арвина относительно стандарта SQL. Troels, у вас есть ссылки, которые мы можем цитировать?

Ответы [ 29 ]

6 голосов
/ 19 августа 2008

Oracle:

select * from (select foo from bar order by foo) where ROWNUM = x
4 голосов
/ 17 мая 2012

Вот быстрое решение вашей путаницы.

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

Здесь Вы можете получить Последнюю строку, заполнив N = 0, Второй последний - при N = 1, Четвертый Последний заполнив N = 3 и так далее.

Это очень распространенный вопрос во время интервью, и это очень простой ответ.

Далее. Если вам нужна сумма, идентификатор или какой-либо порядок сортировки чисел, вы можете перейти к функции CAST в MySQL.

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

Здесь Заполнив N = 4, вы сможете получить пятую последнюю запись наивысшей суммы из таблицы CART. Вы можете указать свое поле и имя таблицы и найти решение.

3 голосов
/ 19 августа 2008

ADD:

LIMIT n,1

Это ограничит результаты одним результатом, начиная с результата n.

3 голосов
/ 30 декабря 2011

Например, если вы хотите выбрать каждую десятую строку в MSSQL, вы можете использовать;

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
  FROM TableName
) AS foo
WHERE rownumber % 10 = 0

Просто возьмите MOD и измените число 10 на любое число, которое вы хотите.

2 голосов
/ 19 августа 2008

Вот общая версия sproc, которую я недавно написал для Oracle, которая допускает динамическое разбиение на страницы / сортировку - HTH

-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
--                this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
--                this would be 20 (-1 for unbounded/not set)

OPEN o_Cursor FOR
SELECT * FROM (
SELECT
    Column1,
    Column2
    rownum AS rn
FROM
(
    SELECT
        tbl.Column1,
        tbl.column2
    FROM MyTable tbl
    WHERE
        tbl.Column1 = p_PKParam OR
        tbl.Column1 = -1
    ORDER BY
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
    (rn >= p_lowerBound OR p_lowerBound = -1) AND
    (rn <= p_upperBound OR p_upperBound = -1);
2 голосов
/ 19 августа 2008

LIMIT n, 1 не работает в MS SQL Server. Я думаю, что это единственная крупная база данных, которая не поддерживает этот синтаксис. Честно говоря, он не является частью стандарта SQL, хотя он так широко поддерживается, что должен быть. Во всем, кроме SQL-сервера LIMIT прекрасно работает. Для сервера SQL я не смог найти элегантного решения.

2 голосов
/ 05 февраля 2018

В Oracle 12c вы можете использовать опцию OFFSET..FETCH..ROWS с ORDER BY

Например, чтобы получить третью запись сверху:

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;
2 голосов
/ 19 августа 2008

Но разве все это на самом деле не просто уловки для хорошего проектирования базы данных? Несколько раз мне понадобилась такая функциональность, как простой запрос, чтобы быстро составить отчет. Для любой реальной работы использование подобных трюков создает проблемы. Если требуется выбрать конкретную строку, просто создайте столбец с последовательным значением и покончите с этим.

1 голос
/ 19 ноября 2010

T-SQL - выбор N-го номера записи из таблицы

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber

Where  RecordNumber --> Record Number to Select
       TableName --> To be Replaced with your Table Name

Например, чтобы выбрать 5-ю запись из таблицы Employee, ваш запрос должен быть

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5
1 голос
/ 22 июня 2009

Для SQL Server общий способ перехода по номеру строки таков:

SET ROWCOUNT @row --@row = the row number you wish to work on.

Например:

set rowcount 20   --sets row to 20th row

select meat, cheese from dbo.sandwich --select columns from table at 20th row

set rowcount 0   --sets rowcount back to all rows

Это вернет информацию 20-го ряда. После этого обязательно укажите количество строк 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...