[Mysql] Как выбрать n-я строка в таблице базы данных SQL?


Answers

Синтаксис LIMIT / OFFSET в PostgreSQL :

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

В этом примере выбирается 21-я строка. OFFSET 20 сообщает Postgres пропустить первые 20 записей. Если вы не укажете предложение ORDER BY , нет гарантии, какую запись вы вернете, что редко бывает полезным.

По-видимому, стандарт SQL умалчивает о предельной проблеме вне сумасшедших функций окон, поэтому каждый реализует ее по-разному.

Question

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

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • оракул

В настоящее время я делаю что-то вроде следующего в 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

Обновление: см . Ответ Troels Arvin относительно стандарта SQL. Троелс, есть ли у вас какие-либо ссылки, которые мы можем привести?




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

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

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;



Ничего необычного, никаких специальных функций, если вы используете Caché, как я ...

SELECT TOP 1 * FROM (
  SELECT TOP n * FROM <table>
  ORDER BY ID Desc
)
ORDER BY ID ASC

Учитывая, что у вас есть столбец идентификатора или столбец datestamp, которому вы можете доверять.




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




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




В Sybase SQL Anywhere:

SELECT TOP 1 START AT n * from table ORDER BY whatever

Не забывайте ORDER BY, или это бессмысленно.




Когда мы работали в MSSQL 2000, мы сделали то, что называли «тройной флип»:

РЕДАКТИРОВАНИЕ

DECLARE @InnerPageSize int
DECLARE @OuterPageSize int
DECLARE @Count int

SELECT @Count = COUNT(<column>) FROM <TABLE>
SET @InnerPageSize = @PageNum * @PageSize
SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)

IF (@OuterPageSize < 0)
    SET @OuterPageSize = 0
ELSE IF (@OuterPageSize > @PageSize)
    SET @OuterPageSize = @PageSize

DECLARE @sql NVARCHAR(8000)

SET @sql = 'SELECT * FROM
(
    SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
    (
        SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
    ) AS t1 ORDER BY <column> DESC
) AS t2 ORDER BY <column> ASC'

PRINT @sql
EXECUTE sp_executesql @sql

Это было не изящно, и это было не быстро, но это сработало.




SELECT
    top 1 *
FROM
    table_name
WHERE
    column_name IN (
        SELECT
            top N column_name
        FROM
            TABLE
        ORDER BY
            column_name
    )
ORDER BY
    column_name DESC

Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет

SELECT
    top 1 *
FROM
    Employee
WHERE
    emp_id IN (
        SELECT
            top 7 emp_id
        FROM
            Employee
        ORDER BY
            emp_id
    )
ORDER BY
    emp_id DESC



select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

Сначала выберите топ-100 строк, упорядочив их по возрастанию, а затем выберите последнюю строку, упорядочившись в порядке убывания и предел до 1. Однако это очень дорогое утверждение, поскольку оно дважды обращается к данным.




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

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

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

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

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

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

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




SQL 2005 и выше имеют встроенную функцию. Используйте функцию ROW_NUMBER (). Он отлично подходит для веб-страниц с просмотром в стиле << Prev и Next >>:

Синтаксис:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23



1 небольшое изменение: n-1 вместо n.

select *
from thetable
limit n-1, 1



T-SQL - выбор N'th RecordNumber из таблицы

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



Вопреки тому, что утверждают некоторые из ответов, стандарт SQL не умалчивает об этом предмете.

Начиная с SQL: 2003, вы можете использовать «функции окна» для пропуска строк и ограничения наборов результатов.

И в SQL: 2008 был добавлен несколько более простой подход, используя
OFFSET skip ROWS FETCH FIRST n ROWS ONLY

Лично я не думаю, что добавление SQL: 2008 было действительно необходимо, поэтому, если бы я был ISO, я бы сохранил его из уже довольно большого стандарта.




Links