T-SQL как выбрать только Вторую строку из таблицы?
У меня есть таблица и мне нужно получить идентификатор второго ряда. Как этого достичь ?
By Top 2 Я выбираю две первые строки, но мне нужно только вторая строка
15 ответов
предполагая SQL Server 2005+ пример того, как получить просто второй ряд (который я думаю вы можете спросить — А почему top не будет работать для вас?)
в SQL Server 2012+ можно использовать смещение. FETCH:
использовать ROW_NUMBER() для нумерации строк, но используйте TOP обрабатывать только первые два.
нет необходимости в функциях номеров строк, если идентификатор поля уникален.
Я предполагаю, что вы используете SQL 2005 или выше. 2-я строка выбирает верхние 2 строки и, используя «ORDER BY ROW_COUNT DESC», 2-я строка располагается как первая, затем она выбирается с помощью TOP 1
Select top 2 [id] from table Order by [id] desc должен дать вам, чтобы вы добавили последние две строки.
однако вам придется обратить особое внимание на order by предложение, как это определит 1-ю и 2-ю возвращенные строки.
Если запрос должен быть такой:
Select top 2 [id] from table Order by ModifiedDate desc
вы можете получить две разные строки. Вам нужно будет решить, какой столбец использовать в вашем заказе по заявлению.
конечно, TOP будет surfice, если вы просто хотите TOP 2, но если вам нужны они индивидуально, чтобы вы могли что-то сделать с этими значениями, используйте функции row_number что даст вам больше контроля над строки, которые вы хотите выбрать
ps. Я сделал это, поскольку я не уверен, что OP после простого TOP 2 в select. (Возможно, я ошибаюсь!)
использовать TOP 2 в SELECT, чтобы получить желаемое количество строк на выходе. Это будет возвращено в последовательности, в которой были созданы данные. Если у вас есть опция даты, вы можете заказать по дате вместе с TOP n предложения.
T-SQL Как выбрать только вторую строку из таблицы?
У меня есть таблица, и мне нужно получить идентификатор второй строки. Как достичь этого?
В Top 2 я выбираю две первые строки, но мне нужна только вторая строка
В SQL Server 2012+ вы можете использовать OFFSET. FETCH:
Предполагая, что SQL Server 2005+ — пример того, как получить только вторую строку (которую, я думаю, вы можете задать), и является ли причина, по которой top не будет работать для вас?)
Используйте ROW_NUMBER() для номера строк, но используйте TOP для обработки только первых двух.
Нет необходимости в функциях номера ряда, если идентификатор поля уникален.
Я предполагаю, что вы используете SQL 2005 или выше. Вторая строка выбирает верхние 2 строки и, используя «ORDER BY ROW_COUNT DESC», вторая строка расположена как первая, затем она выбирается с помощью TOP 1
Select top 2 [id] from table Order by [id] desc должен дать вам пожелать, чтобы вы добавили последние две строки.
Однако вам нужно будет обратить особое внимание на предложение order by , так как это определит возвращаемые 1-й и 2-й строки.
Если запрос должен быть изменен следующим образом:
Select top 2 [id] from table Order by ModifiedDate desc
Вы можете получить две разные строки. Вам нужно будет решить, какой столбец использовать в вашем заказе по инструкции.
Конечно, TOP будет всплывать, если вы просто хотите TOP 2, но если вам нужно их индивидуально, чтобы вы могли что-то сделать с этими значениями, используйте ROW_NUMBER, который даст вам больше контроля над строками, которые вы хотите выбрать
пс. Я сделал это, так как не уверен, что OP после простого TOP 2 в select. (Возможно, я ошибаюсь!)
Используйте TOP 2 в SELECT, чтобы получить нужное количество строк на выходе.
Это вернет в последовательности, в которой данные были созданы. Если у вас есть опция даты, которую вы можете заказать по дате вместе с TOP n Clause.
Чтобы получить верхние 2 строки;
Чтобы получить порядок верхних 2 строк по некоторому полю
Получить только 2-ю строку,
Вы можете использовать OFFSET и FETCH NEXT
НОТА:
OFFSET можно использовать только с предложением ORDER BY. Он не может быть использован сам по себе.
Значение OFFSET должно быть больше или равно нулю. Он не может быть отрицательным, иначе вернет ошибку.
Аргумент OFFSET используется для определения начальной точки для возврата строк из набора результатов. По сути, это исключает первый набор записей.
Аргумент FETCH используется для возврата набора количества строк. FETCH не может использоваться сам по себе, он используется в сочетании с OFFSET.
Как выбрать N-ю строку в таблице базы данных SQL?
Я заинтересован в изучении некоторых (в идеале) агностических способов выбора базы данных nth строка из таблицы базы данных. Было бы также интересно посмотреть, как это может быть достигнуто с помощью встроенных функций следующие базы данных:
- SQL Server
- MySQL
- PostgreSQL
- SQLite
- Оракул
в настоящее время я делаю что-то вроде следующего в SQL Server 2005, но я бы будьте заинтересованы в том, чтобы увидеть другие более агностические подходы:
кредит для вышеуказанного SQL:Firoz Ансари блог
обновление: посмотреть ответ Троэльса Арвина относительно стандарта SQL. Троэльс, у вас есть какие-нибудь ссылки, которые мы можем привести?
29 ответов:
есть способы сделать это в дополнительных частях стандарта, но многие базы данных поддерживают свой собственный способ сделать это.
действительно хороший сайт, который говорит об этом и других вещах http://troels.arvin.dk/db/rdbms/#select-limit.
в принципе, PostgreSQL и MySQL поддерживает нестандартное:
Oracle, DB2 и MSSQL поддерживают стандартные оконные функции:
(который я только что скопировал из сайт связан выше, так как я никогда не использую эти DBs)
обновление: начиная с PostgreSQL 8.4 поддерживаются стандартные оконные функции, поэтому ожидайте, что второй пример будет работать и для PostgreSQL.
The LIMIT / OFFSET синтаксис в PostgreSQL — это:
в этом примере выбирается 21-я строка. OFFSET 20 говорит Postgres пропустить первые 20 записей. Если вы не укажете ORDER BY пункт, нет никакой гарантии, что запись вы получите обратно, что редко бывает полезно.
по-видимому, стандарт SQL молчит о предельной проблеме за пределами сумасшедших оконных функций, поэтому все реализуют ее по-разному.
Я не уверен ни в одном из остальных, но я знаю, что SQLite и MySQL не имеют никакого порядка строк «по умолчанию». В этих двух диалектах, по крайней мере, следующий фрагмент захватывает 15-ю запись из таблицы the_table, сортируя по дате/времени ее добавления:
(конечно, вам нужно будет добавить поле DATETIME и установить его на дату/время добавления этой записи. )
SQL 2005 и выше имеет эту встроенную функцию. Используйте функцию ROW_NUMBER (). Он отлично подходит для веб-страниц с > стиль просмотра:
синтаксис:
Я подозреваю, что это дико неэффективно, но это довольно простой подход, который работал на небольшом наборе данных, который я пробовал.
Это будет получить 5-й элемент, изменить второй верхний номер, чтобы получить другой N-й элемент
только SQL server (я думаю), но должен работать на более старых версиях, которые не поддерживают ROW_NUMBER ().
1 небольшое изменение: n-1 вместо n.
проверьте его на SQL Server:
Это даст вам 10-ю строку таблицы emp!
вопреки тому, что утверждают некоторые ответы, стандарт SQL не молчит по этому вопросу.
начиная с SQL: 2003, вы можете использовать «оконные функции» для пропуска строк и ограничения результирующих наборов.
и в SQL: 2008 был добавлен несколько более простой подход, используя
OFFSET skip ROWS FETCH FIRST n ROWS ONLYлично я не думаю, что добавление SQL:2008 действительно было необходимо, поэтому, если бы я был ISO, я бы сохранил его из уже довольно большого стандарта.
когда мы работали в MSSQL 2000, мы делали то, что мы называли «тройной флип»:
редактировать
Это было не элегантно, и это было не быстро, но это сработало.
выберите n-ю запись сверху
выберите n-ю запись снизу
вот быстрое решение вашей путаницы.
Это очень распространенный вопрос во время интервью, и это очень простой ответ на него.
далее, если вам нужна сумма, идентификатор или какой-то числовой порядок сортировки, чем u может пойти для функции CAST в MySQL.
здесь, заполнив N = 4, Вы сможете получить пятую последнюю запись Самая высокая сумма из таблицы корзины. Вы можете подогнать свое поле и имя таблицы и придумать решение.
добавить:
это ограничит результаты одним результатом, начиная с результата n.
ограничение n, 1 не работает в MS SQL Server. Я думаю, что это единственная крупная база данных, которая не поддерживает этот синтаксис. Справедливости ради, это не является частью стандарта SQL, хотя он настолько широко поддерживается, что он должен быть. Во всем, кроме SQL server LIMIT отлично работает. Для SQL server я не смог найти элегантное решение.
вот общая версия sproc, которую я недавно написал для Oracle, которая позволяет динамическую подкачку / сортировку-HTH
но на самом деле, разве все это не просто салонные трюки для хорошего дизайна базы данных в первую очередь? Несколько раз мне нужна была такая функциональность, как это было для простого запроса, чтобы сделать быстрый отчет. Для любой реальной работы, используя трюки, как эти приглашает неприятности. Если выбор конкретной строки необходим, то просто иметь столбец с последовательным значением и сделать с ним.
например, если вы хотите выбрать каждую 10-ю строку в MSSQL, вы можете использовать;
просто возьмите мод и изменить номер 10 здесь любое число, которое вы хотите.
в Sybase SQL Anywhere:
Не забывайте порядок ПО или это бессмысленно.
для SQL Server общий способ перейти по номеру строки как таковой: Установите ROWCOUNT @row [email protected] = номер строки, над которой вы хотите работать.
Например:
set rowcount 20 —устанавливает строку в 20-ю строку
выберите мясо, сыр из dbo.сэндвич —выберите столбцы из таблицы в 20-й строке
задать количество строк 0-задает количество строк для всех строк
это вернет информацию 20-й строки. Будьте уверены, чтобы поставить в параметр rowcount 0 потом.
Я знаю noobish, но я SQL noob, и я использовал его, так что я могу сказать?
T-SQL-выбор N-го номера записи из таблицы
например, чтобы выбрать 5-ю запись из таблицы сотрудника, ваш запрос должен быть
Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет
невероятно, что вы можете найти SQL-движок, выполняющий этот.
ничего особенного, никаких специальных функций, если вы используете Caché, как я.
учитывая, что у вас есть столбец ID или столбец datestamp, которому вы можете доверять.
вот как я бы сделал это в DB2 SQL, я считаю, что RRN (относительный номер записи) хранится в таблице O / S;
Сначала выберите верхние 100 строк, упорядочив их по возрастанию, а затем выберите последнюю строку, упорядочив ее по убыванию и ограничьте до 1. Однако это очень дорогое заявление, поскольку оно дважды обращается к данным.
Мне кажется, что для эффективности вам нужно 1) сгенерировать случайное число между 0 и одним меньше, чем количество записей базы данных, и 2) иметь возможность выбрать строку в этой позиции. К сожалению, разные базы данных имеют разные генераторы случайных чисел и разные способы выбора строки в позиции в результирующем наборе — обычно вы указываете, сколько строк пропустить и сколько строк вы хотите, но это делается по-разному для разных баз данных. Вот то, что работает для меня в SQLite:
Это зависит от возможности использовать подзапрос в предложении limit (который в SQLite является LIMIT , ) выбор количества записей в таблице должен быть особенно эффективным, являясь частью метаданных базы данных, но это зависит от реализации базы данных. Кроме того, я не знаю, действительно ли запрос построит результирующий набор перед получением N-й записи, но я надеюсь, что это не нужно. Обратите внимание, что я не указание предложения «order by». Возможно, лучше «заказать» что — то вроде первичного ключа, который будет иметь индекс-получение N-й записи из индекса может быть быстрее, если база данных не может получить N-ю запись из самой базы данных без построения результирующего набора.
Как выбрать n-ую строку в таблице базы данных SQL?
Я заинтересован в изучении некоторых (идеально) баз данных агностических способов выбора n-й строки из таблицы базы данных. Было бы также интересно узнать, как это можно достичь, используя встроенную функциональность следующих баз данных:
- SQL Server
- MySQL
- PostgreSQL
- SQLite
- Oracle
В SQL Server 2005 я делаю что-то вроде следующего: но мне было бы интересно увидеть другие более агностические подходы:
Кредит для вышеуказанного SQL: Фироз Ансари-блог
Обновление: См. Troels Arvin answer относительно стандарта SQL. Troels, есть ли у вас какие-либо ссылки, которые мы можем привести?
27 ответов
Есть способы сделать это в необязательных частях стандарта, но многие базы данных поддерживают их собственный способ сделать это.
Действительно хороший сайт, который говорит об этом и других вещах, http://troels.arvin.dk/db/rdbms/#select-limit.
В принципе, PostgreSQL и MySQL поддерживают нестандартные:
Oracle, DB2 и MSSQL поддерживают стандартные функции окна:
(который я только что скопировал с сайта, связанного выше, так как я никогда не использую эти БД)
Обновление: с PostgreSQL 8.4 поддерживаются стандартные функции окон, поэтому ожидаем, что второй пример будет работать и для PostgreSQL.
В этом примере выбирается 21-я строка. OFFSET 20 сообщает Postgres пропустить первые 20 записей. Если вы не укажете предложение ORDER BY , нет никакой гарантии, какую запись вы вернете, что редко бывает полезно.
По-видимому, стандарт SQL молчал о проблеме с ограничениями вне сумасшедших функций окон, поэтому каждый реализует ее по-разному.
Я не уверен ни в одном из остальных, но я знаю, что SQLite и MySQL не имеют упорядочения строк по умолчанию. В этих двух диалектах, по крайней мере, следующий фрагмент захватывает 15-ю запись из таблицы, сортируя по дате/времени, когда она была добавлена:
(конечно, вам нужно будет добавить добавленное поле DATETIME и установить его на дату/время, когда эта запись была добавлена . )
Я подозреваю, что это дико неэффективно, но это довольно простой подход, который работал на небольшом наборе данных, в котором я его пробовал.
Это получит пятый элемент, измените второй верхний номер, чтобы получить другой n-й элемент
Только SQL-сервер (я думаю), но должен работать над более старыми версиями, которые не поддерживают ROW_NUMBER().
SQL 2005 и выше имеет встроенную функцию. Используйте функцию ROW_NUMBER(). Он отлично подходит для веб-страниц с < Пред. И Следующий → стиль просмотра:
1 небольшое изменение: n-1 вместо n.
Проверьте его на SQL Server:
Это даст вам 10-ю строку таблицы emp!
В отличие от некоторых ответов, стандарт SQL не умалчивает об этом предмете.
С SQL: 2003 вы можете использовать «функции окна» для пропуска строк и ограничения наборов результатов.
И в SQL: 2008 был добавлен несколько более простой подход, используя
OFFSET skip ROWS FETCH FIRST n ROWS ONLY
Лично я не думаю, что добавление SQL: 2008 было действительно необходимо, поэтому, если бы я был ISO, я бы сохранил его из уже довольно большого стандарта.
Выберите n-ю запись сверху
выберите n-ю запись снизу
Когда мы работали в MSSQL 2000, мы сделали то, что мы назвали «тройной флип»:
EDITED
Это было не изящно, и это было не быстро, но это сработало.
Вот быстрое решение вашей путаницы.
Здесь вы можете получить последнюю строку, заполняя N = 0, второе последним — N = 1, четвертое последнее заполнение N = 3 и т.д.
Это очень распространенный вопрос по поводу интервью, и это очень простые его аспекты.
Далее Если вы хотите, чтобы сумма, идентификатор или некоторый числовой порядок сортировки превышали u, вы можете использовать функцию CAST в MySQL.
Здесь, заполнив N = 4, вы сможете получить пятый последний рекорд наибольшей суммы из таблицы CART. Вы можете поместить свое имя поля и таблицы и придумать решение.
Например, если вы хотите выбрать каждую 10-ю строку в MSSQL, вы можете использовать;
Просто возьмите MOD и измените номер 10 на любой номер, который вы хотите.
Но на самом деле, разве не все это действительно просто прикольные трюки для хорошего дизайна базы данных в первую очередь? Несколько раз мне нужна была такая функциональность, что это был простой запрос, чтобы сделать быстрый отчет. Для любой реальной работы использование трюков, подобных этим, вызывает проблемы. Если требуется выбрать определенную строку, просто введите столбец с последовательным значением и сделайте с ним.
Это ограничит результаты одним результатом, начиная с результата n.
Вот общая версия sproc, которую я недавно написал для Oracle, что позволяет использовать динамический пейджинг/сортировку — HTH
LIMIT n, 1 не работает в MS SQL Server. Я думаю, что это просто единственная основная база данных, которая не поддерживает этот синтаксис. Справедливости ради, он не является частью стандарта SQL, хотя он так широко поддерживается, что он должен быть. Во всем, кроме SQL Server LIMIT, отлично работает. Для SQL-сервера я не смог найти элегантное решение.
Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет
T-SQL — выбор N’th RecordNumber из таблицы
Например, для выбора 5-й записи из таблицы Employee, ваш запрос должен быть
Для SQL Server общий путь по номеру строки таков: SET ROWCOUNT @row — @row = номер строки, с которой вы хотите работать.
set rowcount 20 — устанавливает строку до 20-й строки
выберите мясо, сыр из dbo.sandwich — выберите столбцы из таблицы в 20-й строке
set rowcount 0 —sets rowcount обратно во все строки
Это вернет информацию о 20-й строке. Обязательно введите значение 0 после.
Я знаю noobish, но я SQL noob, и я использовал его так, что я могу сказать?
В Sybase SQL Anywhere:
Не забывайте ORDER BY или это бессмысленно.
Мне кажется, что для того, чтобы быть эффективным, вам нужно: 1) создать случайное число от 0 до единицы меньше, чем количество записей в базе данных, и 2) иметь возможность выбирать строку в этой позиции. К сожалению, разные базы данных имеют разные генераторы случайных чисел и разные способы выбора строки в позиции в наборе результатов — обычно вы указываете, сколько строк пропустить и сколько строк вы хотите, но для разных баз данных это делается по-разному. Вот что работает для меня в SQLite:
Это зависит от возможности использования подзапроса в предложении limit (которое в SQLite является LIMIT < recs для пропуска > , < recs для принятия > ) Выбор количества записей в таблице должен быть особенно эффективным, являясь частью метаданных базы данных, но это зависит от реализации базы данных. Кроме того, я не знаю, будет ли запрос фактически создавать набор результатов до получения N-й записи, но я надеюсь, что это не понадобится. Обратите внимание, что я не указываю предложение «order by». Возможно, лучше «упорядочить» что-то вроде первичного ключа, который будет иметь индекс — получение N-й записи из индекса может быть более быстрым, если база данных не сможет получить N-й запись из самой базы данных, не создавая набор результатов.
Сначала выберите топ-100 строк, упорядочив их по возрастанию, а затем выберите последнюю строку, упорядочившись в порядке убывания и ограничьте до 1. Однако это очень дорогостоящий оператор, когда он дважды обращается к данным.