Как выбрать строку на основе номера строки? Номер строки sql


MySQL номер строки | AlexGur

В SQL есть специальная функция вывода номеров строк в запросе ROW_NUMBER(). Но в его младшем брате MySQL нет такой функции. Единственный способ вывести номер строки в MySQL - использование переменной.

Поставим задачу: необходимо вывести имя пользователя, количество его очков и место в рейтинге по количеству этих очков. Т.е. такую таблицу:

RANK POINTS NAME
1 500 Алексей
2 300 Сергей
3 200 Виталий

Получать данные будем из таблицы истории получения очков, которая зовётся "history". Выглядит она так:

DATE POINTS NAME
26.03.2017 300 Алексей
16.08.2016 200 Алексей
11.01.2016 200 Виталий
28.12.2015
200 Сергей
14.07.2015 100 Сергей

Для начала получим суммы набранных очков, сгруппированные по именам пользователей и отсортированные по убыванию. Запрос будет выглядеть так:

SELECT SUM(POINTS) as 'POINTS', NAME FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC;

База вернёт следующую таблицу:

POINTS NAME
500 Алексей
300 Сергей
200 Виталий

Отлично! Теперь надо пронумеровать строки, чтобы получить место пользователя в рейтинге. Алексей будет первым, Сергей - вторым, Виталий - третьим.

Нумеровка делается через переменную, добавляемую к выводу. Казалось бы, можно сделать всё просто:

SET @rank=0;

SELECT @rank:=@rank+1 AS 'RANK', SELECT SUM(POINTS) as 'POINTS', NAME FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC;

Но если сделать такой запрос, то результат будет плачевным. Назначение рейтинга произойдёт после группировки, но до сортировки ORDER BY SUM(POINTS). Выглядеть результат будет так:

RANK POINTS NAME
1 500 Алексей
3 300 Сергей
2 200 Виталий

Цифры ранга идут не по порядку: 1, 3, 2. Чтобы исправить положение необходимо добавлять столбец ранга после группировки и сортировки, в отдельном запросе. По логике, получается SELECT в SELECT. Синтаксис будет такой:

SET @rank=0;SELECT @rank:=@rank+1 AS 'RANK', POINTS, NAME FROM(

SELECT SUM(POINTS) as 'POINTS', NAMEFROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC

) as t ;

Обратите внимание на окончание запроса. Без "as t;" написать запрос нельзя, иначе будет ошибка "Every derived table must have its own alias!".

Результат такого запроса будет выглядеть как нормальная ранговая таблица. С правильным расположением цифр ранга:

RANK POINTS NAME
1 500 Алексей
2 300 Сергей
3 200 Виталий

Теперь усложним задачу. Получим содержание одной ячейки такой таблицы.

Представим, что нам нужно вывести номер ранга в личный кабинет пользователя. Чтобы Алексей видел в своём личном кабинете цифру "1", Сергей - "2", а Виталий - "3". Тогда запрос будет содержать SELECT внутри SELECT внутри SELECT. Вот так:

SET @rank=0;SELECT RANK FROM(

SELECT @rank:=@rank+1 AS 'RANK', NAME FROM(

SELECT SUM(POINTS), NAMEFROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC

) as t1

) as t2WHERE NAME = 'Виталий';

Обратите внимание на хвосты: "as t1", "as t2". Нужны разные псевдонимы, иначе будет ошибка "Every derived table must have its own alias!".

P.S.

Конечно же, на реальном проекте такая таблица будет содержать id пользователя, а не его имя. Потому что в строке правды нет, а в числе есть 🙂

www.alexgur.ru

MySQL – Получить номер строки на выбранном Безопасный SQL

Могу ли я запустить оператор select и получить номер строки, если элементы отсортированы?

У меня есть таблица вроде этого:

mysql> describe orders; +-------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------------+------+-----+---------+----------------+ | orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | itemID | bigint(20) unsigned | NO | | NULL | | +-------------+---------------------+------+-----+---------+----------------+

Затем я могу запустить этот запрос, чтобы получить количество заказов по ID:

SELECT itemID, COUNT(*) as ordercount FROM orders GROUP BY itemID ORDER BY ordercount DESC;

Это дает мне подсчет каждого элемента itemID в таблице следующим образом:

+--------+------------+ | itemID | ordercount | +--------+------------+ | 388 | 3 | | 234 | 2 | | 3432 | 1 | | 693 | 1 | | 3459 | 1 | +--------+------------+

Я хочу также получить номер строки, поэтому я мог бы сказать, что itemID=388 – это первая строка, 234 – вторая и т. Д. (По существу, ранжирование заказов, а не только сырое количество). Я знаю, что могу сделать это на Java, когда получаю результат, но мне было интересно, есть ли способ обработать его исключительно в SQL.

Обновить

Установка ранга добавляет его в результирующий набор, но не упорядочивается должным образом:

mysql> SET @rank=0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount -> FROM orders -> GROUP BY itemID ORDER BY rank DESC; +------+--------+------------+ | rank | itemID | ordercount | +------+--------+------------+ | 5 | 3459 | 1 | | 4 | 234 | 2 | | 3 | 693 | 1 | | 2 | 3432 | 1 | | 1 | 388 | 3 | +------+--------+------------+ 5 rows in set (0.00 sec)
Solutions Collecting From Web of "MySQL – Получить номер строки на выбранном"

Взгляните на это .

Измените свой запрос на:

SET @rank=0; SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount FROM orders GROUP BY itemID ORDER BY ordercount DESC; SELECT @rn:=@rn+1 AS rank, itemID, ordercount FROM ( SELECT itemID, COUNT(*) AS ordercount FROM orders GROUP BY itemID ORDER BY ordercount DESC ) t1, (SELECT @rn:=0) t2;

Решение Swamibebop работает, но, используя синтаксис table.* , Мы можем избежать повторения имен столбцов внутреннего select и получить более простой / короткий результат:

select @r := @r+1 , z.* from( /* your original select statement goes in here */ )z, (select @r:=0)y;

Так что это даст вам:

select @r := @r+1 , z.* from( select itemID, count(*) as ordercount from orders group by itemID order by ordercount desc )z, (select @r:=0)y;

Для этого вы можете использовать переменные mysql. Что-то вроде этого должно работать (хотя это два запроса).

SELECT 0 INTO @x; SELECT itemID, COUNT(*) as ordercount, (@x:=@x+1) as rownumber FROM orders GROUP BY itemID ORDER BY ordercount DESC;

sql.fliplinux.com

Порядковый номер строки как результат запроса Transact-SQL: ROW_NUMBER

Возвращает последовательный номер строки в секции результирующего набора, 1 соответствует первой строке в каждой из секций.

ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , … [ n ] ] order_by_clause ) 

Аргументы

PARTITION BY value_expression Делит результирующий набор, полученный по предложению FROM, на секции, к которым применяется функция ROW_NUMBER. value_expression определяет столбец, по которому секционируется результирующий набор. Если PARTITION BY не указан, функция обрабатывает все строки результирующего набора запроса как одну группу. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL). order_by_clause Предложение ORDER BY определяет последовательность, в которой строкам назначаются уникальные номера с помощью функции ROW_NUMBER в пределах указанной секции. Оно должно указываться обязательно. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL).

Типы возвращаемых данных 

- bigint

Общие примечания

Нет гарантии того, что строки, возвращенные запросом, использующим ROW_NUMBER(), будут расставлены точно в одинаковом порядке после каждого выполнения, если не соблюдены следующие условия.
  • Все значения в секционированном столбце являются уникальными.

  • Все значения в столбцах ORDER BY являются уникальными.

  • Сочетания значений из столбца секционирования и столбцов ORDER BY являются уникальными.

Примеры

А. Возврат номера строки SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" FROM Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0; Б. Возврат подмножества строк WITH OrderedOrders AS ( SELECT SalesOrderID, OrderDate, ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber FROM Sales.SalesOrderHeader ) SELECT SalesOrderID, OrderDate, RowNumber FROM OrderedOrders WHERE RowNumber BETWEEN 50 AND 60; В. Использование ROW_NUMBER() с PARTITION SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1), ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row FROM Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0 ORDER BY TerritoryName; Оригинал

ru-developer.blogspot.com

Порядковый номер строки в SQL запросе

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2003.10.16;Скачать: [xml.tar.bz2];

Вниз

Порядковый номер строки в SQL запросе 
AndrewK   (2003-09-25 13:00) [0]

Подскажите, пожалуйста, как получить порядковый номер строки в SQL запросе. Например

select <что-то> as RecNo, * from table

RecNo | ... -------------|------------ 1 | ... 2 | ... 3 | ... 4 | ... 5 | ... ... | ...

Polevi   (2003-09-25 13:01) [1]

только курсор

Nikky   (2003-09-25 13:06) [2]

раз 5 уже видел подобные вопросы, и каждый раз поражаюсь: ЗАЧЕМ??? Все, что я лично когда-либо писал, никогда не требовало номера "строки" :(

Adony   (2003-09-25 13:09) [3]

select identity(int, 1,1) AS RowNum, phone into #tmp from authors

Stas   (2003-09-25 13:09) [4]

Можно, но не просто. Я как-то читал статью на SQL.ru про нумерацию строк, но лучше найти другой выход чем этим заниматься

AndrewK   (2003-09-25 13:12) [5]

2Nikky: Ну, во-первых, просто интересно, можно-ли.. Во-вторых, это нужно для выгрузки данных в 1С. Там поле LineNumber есть, которое хранит порядковый номер строки в документе. Для других работ мне тоже никогда номер строки не нужен был.

Sandman25   (2003-09-25 13:14) [6]

Если для выгрузки, то можно вычисляемое поле сделать.

ZrenBy   (2003-09-25 13:19) [7]

http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=3903

AndrewK   (2003-09-25 14:09) [8]

Спасибо. Проблему обошел через вычисляемое поле.

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2003.10.16;Скачать: [xml.tar.bz2];

Наверх

EMAIL={{}};LOGIN={{AndrewK}};TITLE={{Порядковый номер строки в SQL запросе}};ATTRIBUTES={{}};ID_MSG={{641483}};ID_GROUP={{3}};ID_NNTP={{119151}};ID_DM={{51107}};REPLYNR={{0}};ID_DM_AUTHOR={{0}};ARCHIVE={{2003.10.16}};REPLYDATE={{2003-09-25 13:00}};CNT={{8}};

Память: 0.75 MBВремя: 0.05 c

www.delphimaster.net

sql - MySQL - Получить номер строки на выбранном

Можно ли запустить оператор select и получить номер строки, если элементы отсортированы?

У меня есть таблица вроде этого:

mysql> describe orders; +-------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------------+------+-----+---------+----------------+ | orderID | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | itemID | bigint(20) unsigned | NO | | NULL | | +-------------+---------------------+------+-----+---------+----------------+

Затем я могу запустить этот запрос, чтобы получить количество заказов по ID:

SELECT itemID, COUNT(*) as ordercount FROM orders GROUP BY itemID ORDER BY ordercount DESC;

Это дает мне счет каждого itemID в таблице следующим образом:

+--------+------------+ | itemID | ordercount | +--------+------------+ | 388 | 3 | | 234 | 2 | | 3432 | 1 | | 693 | 1 | | 3459 | 1 | +--------+------------+

Я хочу также получить номер строки, поэтому я мог сказать, что itemID=388 - это первая строка, 234 - вторая и т.д. (по существу, ранжирование заказов, а не только сырое количество). Я знаю, что могу сделать это на Java, когда получаю результат, но мне было интересно, есть ли способ обработать его только в SQL.

Обновление

Установка ранга добавляет его в результирующий набор, но не упорядочен правильно:

mysql> SET @rank=0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount -> FROM orders -> GROUP BY itemID ORDER BY rank DESC; +------+--------+------------+ | rank | itemID | ordercount | +------+--------+------------+ | 5 | 3459 | 1 | | 4 | 234 | 2 | | 3 | 693 | 1 | | 2 | 3432 | 1 | | 1 | 388 | 3 | +------+--------+------------+ 5 rows in set (0.00 sec)

qaru.site

sql - Как выбрать строку на основе номера строки?

Я работаю над небольшим проектом, в котором мне нужно будет выбрать запись из временной таблицы на основе фактического номера строки записи.

Как выбрать запись на основе номера строки?

источник поделиться

Несколько других ответов затронули проблему, но это может объяснить. На самом деле не существует порядка, подразумеваемого в SQL (теория множеств). Поэтому для обозначения "пятой строки" требуется ввести концепцию

Select * From ( Select Row_Number() Over (Order By SomeField) As RowNum , * From TheTable ) t2 Where RowNum = 5

В подзапросе номер строки "создается", определяя ожидаемый заказ. Теперь внешний запрос способен вытащить пятый элемент из этого упорядоченного набора.

источник поделиться

Технически строки SQL не имеют "RowNumbers" в своих таблицах. Некоторые реализации (я думаю, Oracle) предоставляют один из своих, но это не стандарт, а SQL Server/T-SQL этого не делает. Вы можете добавить его в таблицу (вид) с столбцом IDENTITY.

Или вы можете добавить один (для реального) в запрос с помощью функции ROW_NUMBER(), но если вы не укажете свой собственный уникальный ORDER для строк, ROW_NUMBERS будут назначены недетерминированно.

источник поделиться

Есть три способа сделать это.

Предположим, что u имеет таблицу employee с столбцами как emp_id, emp_name, salary. Вам нужны 10 лучших сотрудников, у которых самая высокая зарплата.

  1. Использование функции row_number()

    Select * from ( select emp_id,emp_name,row_number() over (order by salary desc) rank from employee) where rank<=10
  2. Используя rank() аналитическую функцию

    Select * from ( select emp_id,emp_name,rank() over (order by salary desc) rank from employee) where rank<=10
  3. Использование rownum

    select * from (select * from employee order by salary desc) where rownum<=10;
источник поделиться

Если вы используете SQL Server 2012, теперь вы можете использовать offset/fetch:

declare @rowIndexToFetch int set @rowIndexToFetch = 0 select * from dbo.EntityA ea order by ea.Id offset @rowIndexToFetch rows fetch next 1 rows only ответ дан Moho 03 окт. '13 в 19:56 источник поделиться

То, что вы ищете, это row_number(), как упоминает Kaf в комментариях.

Вот пример:

WITH MyCte AS ( SELECT employee_id, RowNum = row_number() OVER ( order by employee_id ) FROM V_EMPLOYEE ORDER BY Employee_ID ) SELECT employee_id FROM MyCte WHERE RowNum > 0 источник поделиться

qaru.site

Страница не найдена

Российская фигуристка, олимпийская чемпионка Алина Загитова Пхёнчхана заняла второе место на финале гран при в Ванкувере, который проходит в эти дни с 7 по 9 декабря. Предлагаем посмотреть произвольную программу Алины Загитовой на гран-при финале 2018-2019 сезона.

Не смотря на небольшие помарки, в целом произвольная программа была оценена судьями очень хорошо. Но отставание после короткой […]

8 декабря ушла в мир иной известная российская правозащитница, одна из старейших сего рода — Людмила Михайловна Алексеева в возрасте 92 лет. Об этом сообщили в пресс-службе СПЧ.

«Сегодня в Москве на 92-м году жизни скончалась старейшая российская правозащитница Людмила Михайловна Алексеева, член Совета при президенте Российской Федерации по развитию гражданского общества и правам […]

Сегодня в ночь с 8 по 9 декабря девушки одиночницы выйду на лед с произвольными программами в рамках финала гран-при по фигурному катанию 2018-2019 сезон. Представляем вам список участниц ФГП и расписание трансляций.

Алина Загитова в произвольной программе финала попробует опередить японскую фигуристку и взять золото

Начало трансляций произвольных программ у девушек в 0.55 […]

Сегодня на финале гран-при по фигурному катанию в Ванкувере девушки откатали свои короткие программы. Российская олимпийская чемпионка Алина Загитова после короткой не смогла занять первое место, однако промежуточное 2 позволит с небольшим отставанием позволит уверенно с психологической точки зрения откатать произвольную программу.

Предлагаем посмотреть короткую программу Алины Загитовой на финале гран-при 2018 в Канаде (Ванкувер) […]

С 7 по 9 декабря в Ванкувере пройдёт финал серии гран-при по фигурному катанию 2018-2019 сезона. Публикуем полное расписание соревнований финала гран-при и трансляций на телеканале «Матч ТВ / Арена«. Помимо этого прямые онлайн трансляции финала гран-при пройдут на телеканала «Первый канал«.

Основная информация о финале ГП

Дата проведения: 7-9 декабря 2018 Место: Канада, […]

Где смотреть сегодня соревнования по фигурному катанию — финал гран-при у девушек, мужчин, танцы и пары, взрослые и юниоры. Когда и во сколько начало трансляция гран при финал и где посмотреть онлайн и по ТВ / интернете?

Этапа серии гран-при 2018-2019 сезона по фигурному катанию подошли к концу. Финал серии ГП пройдет в Ванкувере (Канада) […]

Очередной сезон не успев начаться подходит к своему логическому завершению. По сути осталось 3 крупных международных соревнований: финал серии гран-при, Чемпионат Европы и мира. Хорошо, ещё чемпионат четырех континентов и коммандник. Ладно-ладно, это не конец сезона, но как минимум половина уже прошла 😀 что же нас ждёт в финале гран-при? давайте освежим память и посмотрим […]

Летняя кавер-стори ведущих Матч ТВ помогла фанатам футбола застебать одну «из» ведущих Софью Тартакову. Полуобнаженная ведущая Софья Тартакова на днях раскритиковала одного из руководителей Федерации тенниса России.

Но не будем о грустном, мы собрали фото голой Софьи Тартаковой и решили поделиться публичными фотографиями с вами. Сиськи вроде на месте, да и мужу говорит что […]

Сегодня завершился саммит большой двадцатки G20 в Аргентине. По итогам саммита президент России Владимир Путина дал большую пресс-конференцию. На видео трансляции в записи пресс-конференции Путина на g20 глава государства рассказал о достигнутых договоренностях с международными партнерами и обрисовал общую позицию России по ряду ключевых вопросов международной повестки отвечая на вопросы журналистов.

Видео. Смотрите прямую трансляцию […]

Девушки в наше время почти нечего не стесняются, особенно когда речь доходит до фотографий. Пошлые фото девушки выкладывают в ВК (вконтакте) для всех желающих. Для молодых девушек публикация пошленьких фотографий является средством получения подписчиков и популярности. MoreDez.ru подготовил подборку откровенных и пошлых селфи девушек ВК начиная с 18 плюс возраста.

селфи перед зеркалом в […]

moredez.ru