SQL. Как выбрать первую строку по конкретному столбцу из группы?
Нужно оставить только первые строки по вхождению занчения city_id Допустим есть следующая таблица table.
| id | city_id | sum |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 1 | 20 |
| 3 | 1 | 30 |
| 4 | 2 | 20 |
| 5 | 2 | 30 |
Ожидаемый результат:
| id | city_id | sum |
|---|---|---|
| 1 | 1 | 10 |
| 4 | 2 | 20 |
Отслеживать
задан 11 мая 2022 в 17:19
11 1 1 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В таких случаях помогают оконные функции, а именно ROW_NUMBER().
Пишу на MS SQL, в других диалектах функция может называться по-другому(не проверял):
SELECT id, city_id, "sum" FROM ( SELECT id, city_id, "sum", ROW_NUMBER() OVER(PARTITION BY city_id ORDER BY id) AS NUM FROM TableName ) AS Subquery WHERE NUM = 1
Отслеживать
ответ дан 12 мая 2022 в 3:22
Vitaliy Zlobin Vitaliy Zlobin
1,676 1 1 золотой знак 5 5 серебряных знаков 15 15 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Команда SQL для выборки из базы данных (SELECT, WHERE, LIKE, AND, OR)
Команда SELECT позволяет получить данные из базы. Существует возможность задать различные фильтры и лимиты на выборку. Попробуем привести несколько примеров SQL запросов с ограничением выборки в таблице USERS, в которой содержатся данные пользователей.
Условие WHERE в SQL запросе
Получение всех записей в таблице в одном запросе — это очень редкий случай в реальных проектах. Зачастую нужна либо одна запись, либо диапазон, к примеру из 10 или 100 записей либо отвечающее определённому условию. Такую выборку можно сделать с помощью команды условия WHERE в SQL запросе (слово WHERE переводится с английского как «ГДЕ»).
Сравнение (=, !=, , =)
Продемонстрируем это условие на ограничении выборки по ID пользователя. Приведём сразу несколько примеров запросов:
SELECT * FROM `USERS` WHERE `ID` = 2; SELECT * FROM `USERS` WHERE `ID` != 2; SELECT * FROM `USERS` WHERE `ID` < 2; SELECT * FROM `USERS` WHERE `ID` 2; SELECT * FROM `USERS` WHERE `ID` >= 2;
Как можно догадаться по математическим символам в этих запросах, выборка ограничена по ID пользователя (по целому числу). При каждом условии может возвращаться разное количество строк из таблицы. К примеру, если указано «WHERE `ID` = 2», то вернётся только одна строка, потому что поле «ID» зачастую уникально (то есть у столбца установлено свойство «PRIMARY KEY»). Если в запросе есть символ неравенства «!=» или сравнения «<, >, headline» >Поиск подстроки (LIKE) и полное соответствие (=)
,>
Знак равенства «=» можно использовать в SQL запросах не только для чисел, но и для строк. Представим что нам нужно получить выборку из базы, в которой будут содержаться данные о пользователе с именем «Мышь». Запрос получится такой:
SELECT * FROM `USERS` WHERE `NAME` = 'Мышь';
В результате мы получим все строки, в которых в столбце имени пользователя «NAME» содержится строка «Мышь». Обратите внимание, что совпадение должно быть полным. То есть в выборку не попадут пользователи, имена которых «Мышь серая», «Мышь белая», «Мышь чёрная». Чтобы выбрать и этих пользователей, необходимо сделать текстовый поиск по значению столбца. Для этого используется команда «LIKE» (в переводе с английского этот предлог звучит как «ПОДОБНО», «ВРОДЕ» или «СЛОВНО»).
С помощью команды «LIKE» можно искать подстроку в столбце. Чтобы сделать это поставьте знак процента «%» с той стороны подстроки, с которой могут находиться другие символы. К примеру:
SELECT * FROM `USERS` WHERE `NAME` LIKE 'Мышь%';
В результаты выборки попадёт не только пользователь с именем «Мышь», но и «Мышь серая», «Мышь белая», «Мышь чёрная». Если поставить знак процента ещё и до подстроки:
SELECT * FROM `USERS` WHERE `NAME` LIKE '%Мышь%';
то в выборку попадут не только все предыдущие результаты, но и пользователь с именем «Большая мышь».
LIKE делает поиск независимо от регистра. То есть результаты от ‘%мышь%’ и ‘%МЫШЬ%’ будут одинаковыми.
Логика «и» (AND) и «или» (OR)
Бывают случаи, когда необходимо задать несколько ограничений, связанных логикой. К примеру, если надо выбрать пользователей с ID от 2 до 5, то можно использовать условие с «AND»:
SELECT * FROM `USERS` WHERE `ID` >= 2 AND `ID` < 5;
Количество условий и "AND" неограниченно:
SELECT * FROM `USERS` WHERE `ID` >= 2 AND `ID` < 5 AND `NAME` LIKE 'Мышь%';
Существует возможность использовать логику "ИЛИ" благодаря условию "OR". Продемонстрируем это:
SELECT * FROM `USERS` WHERE `ID` < 2 OR `ID` >5;
С помощью круглых скобок ( ) можно группировать условия OR и AND:
SELECT * FROM `USERS` WHERE (`ID` >= 2 AND `ID` < 5) OR (`ID` >10 AND `NAME` LIKE 'Мышь%');
Выбор определённых столбцов в SELECT
В этой статье во всех SELECT запросах к базе запрашивались все поля. Потому что после слова SELECT стояла звёздочка *. Но чем больше объём данных вы выборке, тем медленнее база данных возвращает ответ. Поэтому старайтесь запрашивать у базы только то, что будете использовать. К примеру, если нужно получить только ID пользователя и имя 'NAME', то перечислите эти поля через запятую после слова SELECT:
SELECT `ID`, `NAME` FROM `USERS` WHERE `ID`
Базы данных сайтов не приспособлены к получению больших выборок. Быстрее всего они работают на объёмах до 100 строк. Если попробовать запросить 100 000 строк из базы и указать вместо конкретных полей *, то можно будет увидеть значительное падение производительности. А чем медленнее загружается ваш сайт, тем меньше посетителей на него будут заходить. Поэтому всегда старайтесь оптимизировать свои запросы к базе.
Как распарсить строку в sql
Для того чтобы распарсить строку в SQL, можно использовать различные функции и операторы, в зависимости от конкретных требований и формата строки.
Например, если строка содержит разделители, такие как запятые или пробелы, то можно использовать функцию SUBSTRING_INDEX() для извлечения определенного фрагмента строки. Например, следующий запрос извлекает первое слово из строки Привет, мир:
SELECT SUBSTRING_INDEX('Привет, мир', ' ', 1);
Результатом запроса будет строка Привет.
Если же требуется извлечь определенный набор символов из строки, то можно использовать функцию SUBSTRING() . Например, следующий запрос извлекает первые три символа из строки Привет:
SELECT SUBSTRING('Привет', 1, 3);
Результатом запроса будет строка При.
Также можно использовать функцию REGEXP_SUBSTR() для извлечения определенного фрагмента строки, используя регулярные выражения. Например, следующий запрос извлекает первое слово из строки Привет, мир:
SELECT REGEXP_SUBSTR('Привет, мир', '^[^ ]+');
Результатом запроса будет строка Привет.
Как выбрать из таблицы строку случайным образом
Во время тестирования иногда бывает нужно выбрать из таблицы случайную порцию данных. Или представьте, что вы реализуете розыгрыш призов и вам требуется определить победителя случайным образом. Как написать такой SQL-запрос?
Один из вариантов решения — выбрать порцию данных с ограничением TOP, отсортировав строки по результату вызова функции NewID. Можно считать, что эта функция генерирует идентификаторы случайным образом, следовательно, при сортировке по ним мы получим случайный порядок строк.

Обратите внимание, что такой способ получения случайной порции хотя и является простым, далеко не самый быстрый. Будьте осторожны при его использовании на больших таблицах! Как решить поставленную задачу максимально быстро и с минимальной нагрузкой на сервер вы можете узнать на наших курсах или в Клубе выпускников.
Заказ добавлен в Корзину.
Для завершения оформления, пожалуйста, перейдите в Корзину!
Авторизации


Телефон:
+7 (495) 232-32-16

Whatsapp:

Адрес главного офиса:
ул. Бауманская, д. 6, стр. 2, бизнес-центр «Виктория Плаза», 4-й этаж

E-mail:

English version
