Group by пример sql: GROUP BY | SQL | SQL-tutorial.ru
Содержание
Группировка по нескольким столбцам
Группировка по нескольким столбцам
Группировка
по нескольким столбцам
В предложениях GROUP BY можно
указывать столько столбцов, сколько вам необходимо, разделяя имена
элементы
списка запятыми. Таким образом, путем группировки одновременно по
нескольким
элементам можно создавать группы внутри групп. Каждый элемент из списка
GROUP
BY должен обязательно присутствовать в списке выбора —
другими словами,
группировать можно только выбираемые элементы.
Пример
SQL:
SELECT region, sex, COUNT(*) AS num_clients
FROM tbl_clients
GROUP BY
region, sex
Результат:
region | sex | num_clients |
California | f | 18 |
California | m | 15 |
Los Angeles | f | 42 |
Los Angeles | m | 57 |
New Jersey | f | 12 |
New Jersey | m | 21 |
New York | f | 15 |
New York | m | 18 |
Oregon | f | 15 |
Oregon | m | 18 |
Portland | f | 12 |
Portland | m | 32 |
Seattle | f | 37 |
Seattle | m | 40 |
Washington | f | 21 |
Washington | m | 11 |
Сначала строки таблицы разделяются
по городам, а затем каждая полученная группа разделяется по полу
клиента. В
результате получается 16 групп, или наборов. После этого к каждому
такому
набору применяется агрегирующая функция, которая вычисляет для каждого
города
количество клиентов женского и мужского пола.
Group by sql по нескольким полям – Тарифы на сотовую связь
391 пользователя считают данную страницу полезной.
Информация актуальна! Страница была обновлена 16.12.2019
Мы с Вами рассмотрели много материала по SQL, в частности Transact-SQL, но мы не затрагивали такую, на самом деле простую тему как группировка данных GROUP BY. Поэтому сегодня мы научимся использовать оператор group by для группировки данных.
Многие начинающие программисты, когда сталкиваются с SQL, не знают о такой возможности как группировка данных с помощью оператора GROUP BY, хотя эта возможность требуется достаточно часто на практике, в связи с этим наш сегодняшний урок, как обычно с примерами, посвящен именно тому, чтобы Вам было проще и легче научиться использовать данный оператор, так как Вы с этим обязательно столкнетесь. Если Вам интересна тема SQL, то мы, как я уже сказал ранее, не раз затрагивали ее, например, в статьях Язык SQL – объединение JOIN или Объединение Union и union all , поэтому можете ознакомиться и с этим материалом.
И для вступления небольшая теория.
Что такое оператор GROUP BY
GROUP BY – это оператор (или конструкция, кому как удобней) SQL для группировки данных по полю, при использовании в запросе агрегатных функций, таких как sum, max, min, count и других.
Как Вы знаете, агрегатные функции работают с набором значений, например sum суммирует все значения. А вот допустим, Вам необходимо просуммировать по какому-то условию или сразу по нескольким условиям, именно для этого нам нужен оператор group by, чтобы сгруппировать все данные по полям с выводом результатов агрегатных функций.
Как мне кажется, наглядней будет это все разобрать на примерах, поэтому давайте перейдем к примерам.
Примечание! Все примеры будем писать в Management Studio SQL сервера 2008.
Примеры использования оператора GROUP BY
И для начала давайте создадим и заполним тестовую таблицу с данными, которой мы будет посылать наши запросы select с использованием группировки group by. Таблица и данные конечно выдуманные, чисто для примера.
Создаем таблицу
Я ее заполнил следующими данными:
- >И в самом начале давайте разберем синтаксис group by, т.е. где писать данную конструкцию:
Синтаксис:
Select агрегатные функции
Where Условия отбора
Group by поля группировки
Having Условия по агрегатным функциям
Order by поля сортировки
Теперь если нам необходимо просуммировать все денежные средства того или иного сотрудника без использования группировки мы пошлем вот такой запрос:
А если нужно просуммировать другого сотрудника, то мы просто меняем условие. Согласитесь, если таких сотрудников много, зачем суммировать каждого, да и это как-то не наглядно, поэтому нам на помощь приходит оператор group by. Пишем запрос:
Как Вы заметили, мы не пишем никаких условий, и у нас отображаются сразу все сотрудники с просуммированным количеством денежных средств, что более наглядно.
Примечание! Сразу отмечу то, что, сколько полей мы пишем в запросе (т.е. поля группировки), помимо агрегатных функций, столько же полей мы пишем в конструкции group by. В нашем примере мы выводим одно поле, поэтому в group by мы указали только одно поле (name), если бы мы выводили несколько полей, то их все пришлось бы указывать в конструкции group by (в последующих примерах Вы это увидите).
Также можно использовать и другие функции, например, подсчитать сколько раз поступали денежные средства тому или иному сотруднику с общей суммой поступивших средств. Для этого мы кроме функции sum будем еще использовать функцию count.
Но допустим для начальства этого недостаточно, они еще просят, просуммировать также, но еще с группировкой по признаку, т.е. что это за денежные средства (оклад или премия), для этого мы просто добавляем в группировку еще одно поле, и для лучшего восприятия добавим сортировку по сотруднику, и получится следующее:
Теперь у нас все отображается, т.е. сколько денег поступило сотруднику, сколько раз, а также из какого источника.
А сейчас для закрепления давайте напишем еще более сложный запрос с группировкой, но еще добавим названия этого источника, так как согласитесь по идентификаторам признака не понятно из какого источника поступили средства. Для этого мы используем конструкцию case.
Вот теперь все достаточно наглядно и не так уж сложно, даже для начинающих.
Также давайте затронем условия по итоговым результатам агрегатных функций (having). Другими словами, мы добавляем условие не по отбору самих строк, а уже на итоговое значение функций, в нашем случае это sum или count. Например, нам нужно вывести все то же самое, но только тех, у которых «всего денежных средств» больше 200. Для этого добавим условие having:
Теперь у нас вывелись все значения sum(summa), которые больше 200, все просто.
Надеюсь, после сегодняшнего урока Вам стало понятно, как и зачем использовать конструкцию group by. Удачи! А SQL мы продолжим изучать в следующих статьях.
Конструкция GROUP BY в команде выборки позволяет разделить записи БД слоя на группы. Группировка записей может выполняться по значениям одного или нескольких полей записей, либо на основании значений столбцов таблицы результатов выборки.
Формат конструкции: GROUP BY | . При задании названии полей данных группировка выполняется по полям данных таблицы, если же номера столбцов – то по номерам столбцов выводимой таблицы (нумерация столбцов начинается с 1).
В команде выборки конструкция GROUP BY размещается непосредственно после конструкции WHERE , перед HAVING и ORDER .
Группировка записей всегда используется совместно с агрегирующими функциями. В таком случае агрегирующие функции применяются отдельно к каждой группе записей. Например, при группировке записей слоя Здания по полю Улица , все записи БД слоя будут разбиты на несколько групп, в каждой группе записи с одинаковой улицей. И, при применении функции COUNT в таком запросе, будет выведено количество записей в каждой группе.
Группировка одновременно может выполняться по нескольким полям (столбцам). Поля (столбцы) группировки перечисляются через запятую, после слов GROUP BY . Группировка сначала выполняется по первому полю, затем, уже сгруппированные записи разбиваются на подгруппы по второму полю и т.д.
При использовании в запросе группировки, среди выводимых столбцов выборки могут задаваться агрегирующие функции, и поля записей по которым выполняется группировка, либо выражения включающие эти поля.
Пример группировки записей
Группировка по полю данных
Выводит список улиц и для каждой улицы количества записей.
Группировка по номеру столбца
Группирует записи по площади домов (с шагом 10, в первой группе с 0 до 10, во второй с 10 до 20 и т.д.) и выводит список групп площадей суммарную площадь для каждой группы.
Группировка по нескольким полям
Группирует записи по кварталам, а в кварталах по улицам и выводит количество записей для каждой подгруппы.
Archil
Новичок
Всем привет. Тружусь над разработкой системы по управлению медийной рекламы на сайте. Одна из основных частей проекта – сбор статистики показов и кликов, при этом надо хранить страну и тип девайса, с которого совершен запрос.
Вот таблица статистики:
В нее за день набегает в среднем 1,5 миллиона записей, значит в месяц около 45 миллиона записей.
Теперь самое главное. Нужно просматривать статистику с группировкой по 2-м полям. Например такой запрос:
При 3-х миллионах записей MySQL падает, при 1-ом миллионе скорость выборки где-то 15-20 секунд.
Простановка индексов по 2-м полям не сильно помогла. Нужна ваша помощь для оптимизации самой таблицы statistics и запроса.
fixxxer
Я бы не советовал использовать для статистики РСУБД.
Посмотри в сторону ElasticSearch.
Если же очень хочется РСУБД – делай пачку таблиц и агрегируй на лету или кроном.
Фанат
oncle terrible
Archil
Новичок
Я бы не советовал использовать для статистики РСУБД.
Посмотри в сторону ElasticSearch.
Если же очень хочется РСУБД – делай пачку таблиц и агрегируй на лету или кроном.
ElasticSearch – это отличная идея, но задача стоит построить систему именно на MySQL
Archil
Новичок
Вурдалак
I’d like to model your domain
Фанат
oncle terrible
fixxxer
Пфффф.
Вот я делал, аж вспомнить страшно, в 2003-м году, код там ужасный, но работает до сих пор и летает:
Это с учетом того, что совсем древняя статистика (старше трех лет) удаляется.
Конечно, в 2003-м году никаких ElasticSearch не было. Сейчас бы в голову не пришло так заморачиваться, взял бы Эластик и не мучался.
fixxxer
Archil
Новичок
fixxxer
Ну, делай пачку таблиц, тут без вариантов вообще.
Archil
Новичок
Ну, делай пачку таблиц, тут без вариантов вообще.
fixxxer
S.Chushkin
Пофигист
1) За такой первичный ключ надо отрывать всё, что можно. И что нельзя тоже отрывать.
Надо заменить на правильный, – в основном зависит от того, что важнее, чтение или запись.
Скорее всего, оптимальным будет одно из двух: или по полю visit_date или по полю id.
2) visit_date – заменить на тип date. id – на int, если записей не будет добавлено больше 4 миллиардов.
country- разве у стран 4-символьный код? Вроде как 2-х. В любом случае, оптимально – smallint.
Подумать над advertisement_system – действительно ли там нужно 255 символов. В любом случае, индекс по нему хорошо ограничить в символах, – тут придётся поискать оптимальную длину.
По всем на миллионах записей? Это круто.
И всё же.
Сначала добавить индексы по требуемым колонкам. Затем анализировать самые тяжёлые запросы и делать многоколоночные индексы.
В частности, для указанного запроса оптимальным будет индекс по трём полям (visit_date, sait_id, link_id). Скорость выборки для 240К найденных строк будет доли секунды.
В общем случае, при оптимальных индексах и достаточной RAM, скорость выборки мало зависит от числа записей в таблице (в разумных пределах, конечно – десятки-сотни млн. записей).
* Стоит помнить, что чем больше индексов, тем медленнее изменение таблицы. Как всегда, придётся придерживаться баланса между противоречащими требованиями.
Забудьте про партицирование. При объёмах таблиц меньше многих сотен гиг бесполезно, зачастую вредно.
Лучше применить сброс редко требуемых данных в архив (другая таблица, лучше – другая БД, например). Естественно, запрос архивных данных будет заметно более длительным, чем актуальных.
Ничего там не падает, если сделано всё правильно. С большой вероятность настройки неправильные.
В целом, если хотите быстроты (доли секунды) то:
– без агрегирования не обойтись как не крути
Тысячи таблиц это конечно перебор, но сотни вполне могут быть. Тут опять – баланс.
– вся база д.б. в RAM (и данные и индексы)
Накройняк, быстрый SSD, но это всё равно будет медленнее или дороже.
– Естественно, оптимальные настройки InnoDB.
– Естественно, правильные запросы.
sql — Предложения GROUP BY и WHERE в одном запросе
Я пытаюсь получить все строки, где состояния больше 1.
Мой стол:
user_id|state
--------------
1000000|Active
1000000|Created
1000001|Active
1000000|Deleted
1000002|Active
1000001|Created
1000003|Active
Мой запрос:
select user_id, count(state) from docs group by user_id order by count(state) desc;
Результат:
user_id | count(state)
1000000 | 3
1000001 | 2
1000002 | 1
1000003 | 1
Но мне нужно печатать только те значения, где count (состояние) больше 1
Я пытаюсь это, но это не работает:
select user_id, count(state) from docs where count(state) > 1 group by user_id;
Мой пример: http://www.sqlfiddle.com/#!9/b2716b/2
0
Ady96
11 Июн 2019 в 11:52
6 ответов
Лучший ответ
HAVING может отфильтровать ненужные для вас строки, когда применяется GROUP BY. Попробуйте следующий запрос для вашей цели. Предложение WHERE используется для фильтрации строк и применяется к каждой строке, а предложение HAVING используется для фильтрации групп в SQL.
SELECT user_id,
COUNT(state)
FROM docs
GROUP BY user_id
HAVING COUNT(state) > 1
ORDER BY COUNT(state) DESC;
3
mkRabbani
11 Июн 2019 в 09:15
Вы также можете использовать концепцию подзапроса. Подробнее о подзапросе можно прочитать здесь.
Здесь, в приведенном ниже запросе, внутренний запрос извлекает счетчик состояния и соответствующий ему user_id, тогда как внешний запрос фильтрует эти результаты для отображения результатов, где count> = 1.
SELECT * FROM (select user_id, count(state) as count from docs group by user_id) WHERE count>1 order by count desc;
0
Kodex
11 Июн 2019 в 11:16
Выберите user_id, состояние из документов, где состояние = (выберите состояние из (выберите состояние, количество (состояние) ‘count’ из группы документов по состоянию, имеющему count (состояние)! = 1) в качестве temp, где temp.state = Docs.state)
0
TamilSelvan A
12 Июн 2019 в 10:20
Следуя вашему коду;
select user_id, count(state) from docs group by user_id order by count(state) desc;
it will be easy and simple to modify.
Попробуй это:
select user_id, count(state) from docs group by user_id where count(state) > 1 order by count(state) desc;
Это должно работать отлично и идеально. Ваш отзыв поможет мне продолжить исследования. Удачи!!!
0
kk.
11 Июн 2019 в 09:04
select *
from (select user_id, count(state) as [count]
from docs
group by user_id)
where count > 1
order by count(state) desc;
Должен сделать трюк
-2
Vyron Paschalidis
11 Июн 2019 в 09:13
Вам, вероятно, нужно использовать предложение «has».
select user_id, count(state)
from docs
group by user_id
having count(state) > 1
order by count(state) desc;
2
Dom
11 Июн 2019 в 08:54
1.9. Предложение GROUP BY — СтудИзба
1.9. Предложение GROUP BY
Часто в запросах требуется формировать промежуточные итоги, что обычно отображается появлением в запросе фразы «для каждого…». Для этой цели в операторе SELECT используется предложение GROUP BY. Запрос, в котором присутствует GROUP BY, называется группирующим запросом, поскольку в нем группируются данные, полученные в результате выполнения операции SELECT, после чего для каждой отдельной группы создается единственная суммарная строка. Стандарт SQL требует, чтобы предложение SELECT и фраза GROUP BY были тесно связаны между собой. При наличии в операторе SELECT фразы GROUP BY каждый элемент списка в предложении SELECT должен иметь единственное значение для всей группы. Более того, предложение SELECT может включать только следующие типы элементов: имена полей, итоговые функции, константы и выражения, включающие комбинации перечисленных выше элементов.
Все имена полей, приведенные в списке предложения SELECT, должны присутствовать и во фразе GROUP BY – за исключением случаев, когда имя столбца используется в итоговой функции. Обратное правило не является справедливым – во фразе GROUP BY могут быть имена столбцов, отсутствующие в списке предложения SELECT.
Если совместно с GROUP BY используется предложение WHERE, то оно обрабатывается первым, а группированию подвергаются только те строки, которые удовлетворяют условию поиска.
Стандартом SQL определено, что при проведении группирования все отсутствующие значения рассматриваются как равные. Если две строки таблицы в одном и том же группируемом столбце содержат значение NULL и идентичные значения во всех остальных непустых группируемых столбцах, они помещаются в одну и ту же группу.
Пример 43. Вычислить средний объем покупок, совершенных каждым покупателем.
SELECT Klient.Familiya, Аvg(Sdelka. Kolichestvo)
AS Srednee Kolichestvo
FROM Klient INNER JOIN Sdelka
ON Klient.KodKlienta= Sdelka.KodKlienta
GROUP BY Klient.Familiya
Пример 44. Определить, на какую сумму был продан товар каждого наименования.
SELECT Tovar.Nazvanie,
Sum(Tovar.Cena*Sdelka. Kolichestvo)
AS Stoimosti
FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovara=Sdelka.KodTovara
GROUP BY Tovar.Nazvanie
Пример 45. Подсчитать количество сделок, осуществленных каждой фирмой.
SELECT Klient.Firma, Count;(Sdlka.KodSdelki)
AS Kolichestvo Sdelok
FROM Klient INNER JOIN Sdelka
ON Klient.KodKlienta= Sdelka.KodKlienta
GROUP BY Klient.Firma
Пример 46. Подсчитать общее количество купленного для каждой фирмы товара и его стоимость.
SELECT Klient.Firma, Sum(Sdelka. Kolichestvo)
AS Obshee Kolichestvo,
Sum(Tovar Cena*Sdelka. Kolichestvo)
AS Stoimosti FROM Tovar INNER JOIN
(Klient INNER JOIN Sdelka
ON Klient.KodKlientа=Sdelka.KodKlientа)
ON Tovar.KodTovarа=Sdelka.KodTovarа GROUP BY Klient.Firma
Пример 47.Сколько студентов на каждом курсе
SELECT Count (*) FROM Student
GROUP BY Kurs;
Пример 48.Сколько студентов проживают в Москве
SELECT Count (*) FROM Student
WHERE City = «Москва»
GROUP BY City;
Пример 49. Определить суммарную стоимость каждого товара за каждый месяц.
SELECT Tovar.Nazvanie, Month(Sdelka.Data)
AS Mesyac,
Sum(Tovar.Cena*Sdelka.Kolichestvo)
AS Stoimosti FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovarа=Sdelka.KodTovarа
GROUP BY Tovar.Nazvanie, Month(Sdelka.Data)
Пример 50. Определить суммарную стоимость каждого товара первого сорта за каждый месяц.
SELECT Tovar.Nazvanie, Month(Sdelka.Data)
AS Mesyac, Sum(Tovar.Cena*Sdelka. Kolichestvo)
AS Stoimosti
FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovarа=Sdelka.KodTovarа
WHERE Tovar.Sort=»Первый»
GROUP BY Tovar.Nazvanie, Month(Sdelka.Data)
SQL — Group By — CoderLessons.com
Предложение SQL GROUP BY используется в сотрудничестве с оператором SELECT для объединения идентичных данных в группы. Это предложение GROUP BY следует за предложением WHERE в инструкции SELECT и предшествует предложению ORDER BY.
Синтаксис
Основной синтаксис предложения GROUP BY показан в следующем блоке кода. Предложение GROUP BY должно соответствовать условиям в предложении WHERE и должно предшествовать предложению ORDER BY, если оно используется.
SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2 ORDER BY column1, column2
пример
Предположим, что таблица CUSTOMERS содержит следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
Если вы хотите узнать общую сумму заработной платы по каждому клиенту, запрос GROUP BY будет выглядеть следующим образом.
SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME;
Это даст следующий результат —
+----------+-------------+ | NAME | SUM(SALARY) | +----------+-------------+ | Chaitali | 6500.00 | | Hardik | 8500.00 | | kaushik | 2000.00 | | Khilan | 1500.00 | | Komal | 4500.00 | | Muffy | 10000.00 | | Ramesh | 2000.00 | +----------+-------------+
Теперь давайте посмотрим на таблицу, в которой таблица CUSTOMERS содержит следующие записи с повторяющимися именами:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Ramesh | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | kaushik | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
Опять же, если вы хотите узнать общую сумму заработной платы по каждому клиенту, запрос GROUP BY будет выглядеть следующим образом:
SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME;
Это даст следующий результат —
«Group By» в SQL и Python: сравнение
Аналитики и исследователи данных с глубоким пониманием нескольких языков аналитического программирования оказываются в преимуществе в современном ландшафте данных. Преобладающий диалог вокруг такого многоязычного подхода, особенно с SQL и Python, обычно изображает языки как взаимодополняющие, но функционально дискретные. Но на самом деле существует много перекрывающихся функций, которые могут быть выполнены как SQL, так и Python.
Изучение перекрывающихся функций SQL и Python может помочь тем из нас, кто знаком с одним языком, лучше освоить другой. И, обладая глубоким пониманием того и другого, мы все можем принимать более взвешенные решения о том, как комбинировать и использовать каждый из них, упрощая выбор правильного инструмента для каждой задачи.
Например; многие функции написаны более кратко на Python. Но если преимущество краткости перевешивается ценностью наличия всего аналитического кода на одном языке, вы все равно захотите использовать SQL. С другой стороны, Python включает много сложных функций, которые не осуществимы в SQL, и ценность подхода, основанного только на SQL, может быть перевешена более широким набором операций, которые становятся доступными при совместном использовании обоих языков. Только узнав о функциональном совпадении аналитических языков, мы сможем эффективно принимать эти решения.
Сегодня мы сосредоточимся на операциях GroupBy , которые являются еще одним отличным примером задачи, которая может быть выполнена как SQL, так и Python, и решение которой зависит от ваших целей.
Чтобы увидеть, все примеры, упомянутые в этом посте, реализованы на практике, посмотрите этот пример отчета. Этот пост структурирован так, что вы можете пропустить его на основе ваших текущих знаний.
SQL
Функции агрегации
Когда мы применяем операцию группировки к набору данных в SQL, мы разделяем набор данных на отдельные «группы». На практике тип функции, наиболее часто применяемой к группе данных, – это функция агрегирования. На высоком уровне процесс агрегирования данных может быть описан как применение функции к ряду строк для создания меньшего подмножества строк. На практике это часто выглядит как вычисление общего количества строк в наборе данных или вычисление суммы всех строк в определенном столбце.
По умолчанию агрегатные функции SQL, например, count() применяются ко всем строкам в наборе данных и возвращают одно значение. Например, следующий запрос возвращает общее количество строк в таблице sf_bike_share_trip:
select count(*) as num_trips from modeanalytics.sf_bike_share_trip
Интересно, что агрегатная функция count() имеет другую, часто упускаемую из вида функциональность. Если вы укажете столбец внутри функции count(), он вернет количество строк с ненулевыми экземплярами этого столбца вместо абсолютного общего количества строк. Например, если мы хотим рассчитать количество поездок, когда поле zip_code не равно нулю, мы могли бы использовать следующий запрос:
select count(zip_code) as num_trips_with_zip_code from modeanalytics.sf_bike_share_trip
Применение функций агрегирования ко всем наборам данных является полезной функциональностью, но, как упоминалось ранее, мы часто хотим применять эту функцию отдельно для отдельных групп данных в наборе данных. Здесь начинается операция group by.
Group By
На высоком уровне предложение group by в SQL позволяет независимо применять функции агрегирования к отдельным группам данных в наборе данных.
Возвращаясь к нашему предыдущему запросу, давайте посчитаем количество поездок на велосипеде ( count(*)) по станции, с которой они начали ( start_station_name). Мы делаем это, добавляя start_station_name к списку выбранных столбцов и добавляя предложение group by, явно указывающее SQL для группировки count(*)агрегации по столбцу start_station_name:
select bst.start_station_name, count(*) as num_trips from modeanalytics.sf_bike_share_trip bst group by bst.start_station_name
Что, если мы также хотели бы указать среднюю, минимальную и максимальную продолжительность поездки на начальную станцию? SQL позволяет добавить к этому запросу произвольное количество функций агрегирования:
select bst.start_station_name, count(*) as num_trips, avg(bst.duration) as avg_duration_seconds, min(bst.duration) as min_duration_seconds, max(bst.duration) as max_duration_seconds from modeanalytics.sf_bike_share_trip bst group by bst.start_station_name
SQL также позволяет нам добавлять произвольное количество столбцов в наше предложение group by. Например, если мы хотим рассчитать количество поездок и среднюю, минимальную и максимальную продолжительность поездки для каждой комбинации начальных и конечных станций, мы можем сделать это с помощью следующего запроса:
select bst.start_station_name, bst.end_station_name, count(*) as num_trips, avg(bst.duration) as avg_duration_seconds, min(bst.duration) as min_duration_seconds, max(bst.duration) as max_duration_seconds from modeanalytics.sf_bike_share_trip bst group by bst.start_station_name,bst.end_station_name
Как видите, мы добавили столбец end_station_name как в наш список select, так и в наше предложение group by. Большинство платформ SQL предлагают некоторый синтаксический сахар для этой операции, что позволяет вам использовать порядковый номер столбца в selectвыражении вместо явной ссылки на имена столбцов. На практике это будет выглядеть так:
select bst.start_station_name, bst.end_station_name, count(*) as num_trips, avg(duration) as avg_duration_seconds, min(duration) as min_duration_seconds, max(duration) as max_duration_seconds from modeanalytics.sf_bike_share_trip bst group by 1,2
Примечание: не все платформы SQL позволяют ссылаться на столбцы по их порядковому положению в операторе select. Например, в базах данных Oracle и SQL Server вам нужно будет явно ссылаться на столбцы по имени в group byпредложении.
Что если мы хотим строго отфильтровать значения, возвращаемые этим запросом, чтобы начать комбинации станций и конечных станций с более чем 1000 поездок? Поскольку предложение where в SQL поддерживает только фильтрацию записей, а не результатов функций агрегирования, нам нужно найти другой способ. Вот где оператор having вступает в силу.
having
Предложение having позволяет пользователям фильтровать значения, возвращаемые из сгруппированного запроса, на основе результатов функций агрегирования.
Как упоминалось ранее, мы хотим отфильтровать значения, возвращаемые в нашем запросе, для комбинаций начальной и конечной станций с более чем 1000 рейсов. Мы можем достичь этого, используя следующий запрос:
select bst.start_station_name, bst.end_station_name, count(1) as num_trips, avg(duration) as avg_duration_seconds, min(duration) as min_duration_seconds, max(duration) as max_duration_seconds from modeanalytics.sf_bike_share_trip bst group by 1,2 having count(1) > 1000
На данный момент мы изучили многое из того, что SQL может делать с функциональностью group by. Давайте посмотрим, как эта же реализация будет выглядеть в Python, используя библиотеку pandas.
Python
Как обычно, SQL и pandas довольно сильно различаются по синтаксису, но имеют много общего в функциональном отношении. SQL может быть более простым вариантом, имея под рукой только более простые задачи, но предел функциональности группировки в SQL только поверхностно затрагивает функциональность группировки Python с использованием панд.
В pandas, «groups» данные создаются с помощью python метода называется groupby(). Метод groupby() может быть вызван непосредственно на объект Dataframe в pandas.
В качестве примера мы собираемся использовать выходные данные SQL-запроса, названные Python в качестве входных данных для нашего Dataframe( df) в нашей записной книжке Python. Обратите внимание, что этот Dataframe не имеет функций агрегирования, вычисляемых с помощью SQL. Он просто использует SQL, чтобы выбрать необходимые поля для нашего анализа, а мы будем использовать панды, чтобы сделать все остальное. Дополнительным преимуществом выполнения этой операции в Python является то, что рабочая нагрузка перемещается из хранилища данных.
В нашей записной книжке Python мы собираемся использовать метод groupby(), чтобы сгруппировать наш Dataframe по столбцу start_station_name и присвоить этот результат новой переменной с именем grouped_single:
grouped_single = df.groupby('start_station_name')
Применение метода groupby() к нашему Dataframe объекта возвращает объект GroupBy, который затем присваивается переменной grouped_single. Важная вещь, которую следует отметить в отношении объекта GroupBy для Pandas, заключается в том, что в момент создания объекта не происходило разбиение Dataframe. Объект GroupBy просто содержит всю необходимую ему информацию о характере группировки. Агрегирование не будет происходить, пока мы явно не вызовем функцию агрегирования для объекта GroupBy.
Если мы хотим , чтобы наши группы Dataframe на как в колонках start_station_name и end_station_name, как мы это делали в нашем SQL запрос, мы можем просто добавить столбец end_station_name в наш список группирования ключей внутри метода groupby():
grouped_multiple = df.groupby(['start_station_name','end_station_name'])
В отличие от SQL, метод groupby() в pandas не имеет понятия порядковых ссылок на позиции. Таким образом, вам нужно будет явно ссылаться на ключи группировки по имени.
Теперь, когда у нас есть объект GroupBy, созданный с соответствующими группировками, мы можем применить к нему методы агрегирования. По умолчанию pandas будет применять любой метод агрегации, который вы вызываете для объекта GroupBy, ко всем столбцам, не требующим вмешательства. Поскольку нас интересует только применение методов агрегирования к одному столбцу ( trip_duration_seconds), мы выберем только этот столбец из нашего нового объекта GroupBy. То, как вы выбираете отдельные столбцы в объекте GroupBy, аналогично тому, как вы делаете это с объектом Dataframe:
grouped_multiple_column = df.groupby(['start_station_name','end_station_name'])['trip_duration_seconds']
Pandas позволяет выбрать любое количество столбцов, используя эту операцию. Pandas будет возвращать сгруппированные серии, когда вы выбираете один столбец, и сгруппированные кадры данных, когда вы выбираете несколько столбцов. Теперь, когда у нас есть один столбец, выбранный из нашего объекта GroupBy, мы можем применить к нему соответствующие методы агрегирования. Есть несколько способов сделать это. Мы можем присвоить переменную объекту GroupBy и затем вызвать метод агрегирования для этой переменной:
grouped_multiple = df.groupby(['start_station_name','end_station_name']) avg_trip_duration = grouped_multiple['trip_duration_seconds'].mean()
Или мы можем использовать метод цепочки:
avg_duration_seconds = df.groupby(['start_station_name','end_station_name'])['trip_duration_seconds'].mean()
Мы можем повторить этот процесс для каждого из агрегатов, которые мы рассчитываем:
# Вычисления агрегатов по отдельности num_trips = df.groupby(['start_station_name','end_station_name']).size() avg_duration_seconds = df.groupby(['start_station_name','end_station_name'])['trip_duration_seconds'].mean() min_duration_seconds = df.groupby(['start_station_name','end_station_name'])['trip_duration_seconds'].min() max_duration_seconds = df.groupby(['start_station_name','end_station_name'])['trip_duration_seconds'].max(
Вы можете увидеть, как это может запутаться, если вы вычисляете большое количество агрегатов. К счастью, pandas предлагает способ вычисления нескольких агрегатов для одного объекта GroupBy. Метод agg() может принимать принимать список методов агрегирования для отдельных столбцов:
# Calculate aggregations at once all_together = (df.groupby(['start_station_name','end_station_name'] .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]}))
Вы также можете связать метод rename() в pandas, чтобы переименовать новые столбцы агрегации в нужные вам имена:
# Calculate and rename aggregations all_together = (df.groupby(['start_station_name','end_station_name']) .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]}) .rename(columns={'size': 'num_trips', 'mean': 'avg_duration_seconds', 'amin': 'min_duration_seconds', 'amax': 'max_duration_seconds'}))
Теперь мы реплицировали наш SQL-запрос до момента фильтрации наших групп на основе результата функции агрегирования. В pandas вы можете использовать стандартное индексирование для возврата подмножества исходного объекта на основе результата функции агрегирования. Например, если мы хотим отфильтровать наш результирующий набор только для комбинаций начальной станции и конечной станции с более чем 1000 поездок, мы могли бы использовать следующий оператор:
all_together[all_together['trip_duration_seconds']['num_trips'] > 1000]
К этому моменту мы полностью реплицировали вывод нашего исходного запроса SQL, перенося работу по группированию и агрегированию на панд. Опять же, этот пример только показывает, что возможно, используя функциональность группировки панд. Многие групповые операции, которые являются сложными (или даже невозможными) с использованием SQL, оптимизированы в среде pandas. Это включает в себя такие вещи, как преобразования набора данных , анализ квантилей и сегментов, линейную регрессию по группам и применение пользовательских функций, среди прочих. Доступ к этим типам операций значительно расширяет спектр вопросов, на которые мы можем ответить.
Blur The Line
Глубокое понимание функций группировки в SQL и Python может помочь вам определить, какой язык следует использовать для какой функции и в какое время. Если у вас нет сложных требований к группировке, вы, вероятно, захотите работать в SQL, чтобы вы могли хранить всю свою работу на одном языке. Но если ваш анализ включает более тяжелые групповые операции, подобные упомянутым выше, перемещение всех групповых операций в записную книжку Python позволит вам воспользоваться преимуществами более сложной функциональности, доступной в pandas.
Это преимущество возможности использования нескольких языков анализа данных; Вы можете настроить гибридный подход в соответствии с вашими потребностями по мере их развития.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Десять простых шагов к полному пониманию SQL
Очень многие программисты смотрят на SQL, как на страшного зверя. SQL — один из немногих декларативных языков, и его поведение в корне отличается от того, как работают императивные, объектно-ориентированные и даже функциональные языки программирования. Хотя многие рассматривают SQL в некоторой степени функциональным.
И вот…
1. SQL является декларативным
SELECT first_name, last_name
FROM employees
WHERE salary > 10000
Все понятно. И вас не волнует, откуда эти записи о сотруднике (employee) берутся. Вам лишь нужны те, у которых достойная зарплата (salary).
Что мы из этого узнаем?
Если все так просто, в чем же проблема? Проблема в том, что большинство из нас интуитивно мыслит рамками императивного программирования. Вроде: «машина, сделай это, затем то, но сначала проверь то и се.» А значит, нужно хранить временные результаты в переменных, составлять циклы, вызывать функции и т. д. и т. п.
Забудьте обо всем этом. Думайте о том, как объявлять вещи. Не о том, как сказать машине, вычислить что-либо.
2. Код SQL не является упорядоченным
Обычно путаница происходит из-за того, что элементы кода SQL не расположены в том порядке, в каком они выполняются. Лексический порядок выглядит так:
- SELECT [ DISTINCT ]
- FROM
- WHERE
- GROUP BY
- HAVING
- UNION
- ORDER BY
Для простоты перечислены не все предложения SQL. Этот словесный порядок принципиально отличается от логического порядка (который в свою очередь может отличаться от порядка выполнения в зависимости от выбора оптимизатора):
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- UNION
- ORDER BY
Три пункта, которые следует отметить:
1. Первое предложение здесь FROM, а не SELECT. Сначала происходит загрузка данных с диска в память, чтобы с ними можно было работать.
2. SELECT выполняется после большинства других предложений. Главное, после FROM и GROUP BY. Это важно понимать, если думаете, что можете ссылаться на элементы, которые объявляете в предложении SELECT из предложения WHERE. Следующее невозможно:
SELECT A.x + A.y AS z
FROM A
WHERE z = 10 -- z здесь не доступна!
Есть два варианта повторно использовать z. Либо повторить выражение:
SELECT A.x + A.y AS z
FROM A
WHERE (A.x + A.y) = 10
… либо прибегнуть к производным таблицам, общим табличным выражениям или представлениям данных, чтобы избежать повторения кода. Смотрите примеры ниже.
3. UNION ставится перед ORDER BY в лексическом и логическом порядках. Многие думают, что каждый подзапрос UNION можно упорядочить, но по стандарту SQL и в большинстве диалектов SQL это не так. Хотя в некоторых диалектах позволяется упорядочивание подзапросов или производных таблиц, нет никакой гарантии, что такой порядок будет сохранен после выполнения операции UNION.
Обратите внимание, что не все базы данных реализуют вещи одинаковым образом. Правило номер 2, например, не применяется в точности, как описано выше, для MySQL, PostgreSQL, и SQLite.
Что мы из этого узнаем?
Чтобы избежать распространенных ошибок, всегда следует помнить о лексическом и логическом порядках предложений SQL. Если вы усвоили эти отличия, становится понятным, почему одни вещи работают, другие нет.
Конечно, неплохо, если бы язык был спроектирован таким образом, когда лексическая последовательность фактически отражает логический порядок, как это реализовано в Microsoft LINQ.
3. Вся суть SQL заключается в ссылках на таблицы
Из-за разницы между лексическим упорядочением и логическим упорядочением большинство новичков, вероятно, думают, что значения столбцов являются объектами первого класса в SQL. Но, нет. Наиболее важными являются ссылки на таблицы.
Стандарт SQL определяет предложение FROM следующим образом:
<from clause> ::=
FROM <table reference>
[ { <comma> <table reference> }... ]
Вывод предложения FROM — это объединенная ссылка на таблицу объединенного значения всех ссылок. Попробуем это переварить.
FROM a, b
Указанная выше запись производит комбинированную ссылку на таблицу значений a и b. Если a имеет 3 колонки и b 5 колонок, тогда выходная таблица “output table” будет состоять из 8 (3 + 5) столбцов.
Записи, содержащиеся в этой комбинированной табличной ссылке являются перекрестным / декартовым произведением a x b. Иными словами, каждая запись a образует пару с записью b. Если a имеет 3 записи, а b 5 записей, описанная выше ссылка на таблицу производит 15 записей (3 x 5).
Этот вывод переводится в предложение GROUP BY (после фильтрации в предложении WHERE), где преобразуется в новый вывод. Разберемся с этим позже.
Если мы посмотрим на эти примеры в свете реляционной алгебры / теории множества, то таблица SQL — это отношение или набор кортежей. Каждое предложение SQL преобразует одно или несколько отношений, чтобы создать новые отношения.
Что мы из этого узнаем?
Всегда думайте категориями ссылок на таблицы, чтобы понять, как данные передаются в предложениях SQL.
4. Ссылки на таблицы SQL могут быть довольно функциональными
Ссылка на таблицу — мощная штука. Примером их силы является ключевое слово JOIN, которое в действительности не является выражением SELECT, а частью специальной ссылки на таблицу. Объединенная таблица, как определено в стандарте SQL (упрощенный):
<table reference> ::=
<table name>
| <derived table>
| <joined table>
Вернемся к нашему примеру:
FROM a, b
a может по сути быть объединенной таблицей:
a1 JOIN a2 ON a1.id = a2.id
Развивая предыдущее выражение, получим:
FROM a1 JOIN a2 ON a1.id = a2.id, b
Хотя не рекомендуется объединять синтаксис, где приводится разделенный запятыми список ссылок на таблицы, с синтаксисом объединенных таблиц, но так можно делать. В результате, объединенная ссылка будет содержать величины a1+a2+b.
Производные таблицы еще мощнее, чем объединенные таблицы. Мы до этого еще дойдем.
Что мы из этого узнаем?
Всегда нужно думать категориями ссылок на таблицы. Это поможет не только понять, как данные переходят в предложениях SQL, (смотрите предыдущий раздел), но и как создаются сложные ссылки на таблицы.
И, что важно, понять, JOIN является ключевым словом для построения соединенных таблиц. А не частью оператора SELECT. Некоторые базы данных позволяют использование JOIN в операторах INSERT, UPDATE, DELETE
5. В SQL следует использовать таблицы JOIN, вместо разделенных запятыми
Ранее мы видели это предложение:
FROM a, b
Продвинутые разработчики SQL, вероятно, скажут, что не следует вообще использовать список с разделителями-запятыми, и всегда отображать таблицы JOIN. Это улучшит читаемость инструкции SQL, и тем самым предотвратить ошибки.
Одна очень распространенная ошибка заключается в том, чтобы где-то забыть предикат JOIN. Подумайте о следующем:
FROM a, b, c, d, e, f, g, h
WHERE a.a1 = b.bx
AND a.a2 = c.c1
AND d.d1 = b.bc
— etc…
Синтаксис соединенных таблиц:
- Безопаснее, так как предикаты join можно размещать вблизи соединенных таблиц, тем самым предотвращая ошибки.
- Более выразительные, так как можно различать OUTER JOIN, INNER JOIN и т. д.
Что мы из этого узнаем?
Всегда применяйте JOIN. Никогда не используйте ссылки на таблицы, разделенные запятыми, в предложениях FROM.
6. Различные операции JOIN в SQL
Операции JOIN состоят, в основном, из следующих пяти видов:
- EQUI JOIN
- SEMI JOIN
- ANTI JOIN
- CROSS JOIN
- DIVISION
Эти термины обычно используются в реляционной алгебре. SQL задействует другие термины для вышеуказанных понятий, если они вообще существуют. Давайте рассмотрим их поближе:
EQUI JOIN
Это наиболее распространенная операция JOIN. Содержит два подвида:
- INNER JOIN (или просто JOIN)
- OUTER JOIN (далее подразделяется на LEFT, RIGHT, FULL OUTER JOIN)
Разницу лучше объяснить на примере:
-- Ссылка на таблицу содержит авторов и их книги
-- Есть одна запись для каждой книги и ее автора.
-- Авторы без книг НЕ включены
author JOIN book ON author.id = book.author_id
-- Ссылка на таблицу содержит авторов и их книги
-- Есть одна запись для каждой книги и ее автора.
--... ИЛИ есть записи "empty" (пустые) для авторов без книг
-- ("empty" означает, что все столбцы книги равны NULL)
author LEFT OUTER JOIN book ON author.id = book.author_id
SEMI JOIN
Эта реляционная концепция в SQL может быть выражена двумя способами: С помощью предиката IN или с использованием предиката EXISTS. «Semi» на латыни означает «половина». Этот тип соединения используется для объединения только «половины» ссылки на таблицу. Что это значит? Рассмотрим вновь вышеуказанное объединение автора и книги. Представим, что нам не нужны комбинации автор — книга, а только авторы, у которых есть книги. Тогда можно написать:
-- Использование IN
FROM author
WHERE author.id IN (SELECT book.author_id FROM book)
— Использование EXISTS
FROM author
WHERE EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)
Хотя нет общего правила, следует предпочесть IN или EXISTS, но можно сказать примерно так:
Предикаты IN легче читать, чем предикаты EXISTS
Предикаты EXISTS более выразительные, чем предикаты IN (т. е. их проще выразить, чем сложные предикаты SEMI JOIN)
В производительности нет какой-либо заметной разницы. Но большая разница в производительности может быть в некоторых базах данных.
Поскольку INNER JOIN также выдают результаты авторов, у которых есть книги, многие начинающие подумают, что можно удалить дубликаты с помощью ключевого слова DISTINCT. Им кажется, что SEMI JOIN можно выразить следующим образом:
-- Найти только тех авторов, которые имеют книги
SELECT DISTINCT first_name, last_name
FROM author
JOIN book ON author.id = book.author_id
Так делать не рекомендуется по двум причинам:
- Замедляется производительность, так как база данных только для того, чтобы удалить дубликаты, должна загрузить в память множество данных.
- Такой способ решения не совсем правильный, хотя и приводит к верным результатам в этом примере. Но если вы соединяете больше ссылок на таблицы, удаление дубликатов превращается в реальную проблему.
ANTI JOIN
Эта реляционная концепция является полной противоположностью SEMI JOIN. Ее можно образовать, просто добавив ключевое слово NOT в предикатах IN или EXISTS. Пример, где мы выберем тех авторов, у которых нет книг:
-- Использование IN
FROM author
WHERE author.id NOT IN (SELECT book.author_id FROM book)
— Использование EXISTS
FROM author
WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)
Применяются те же правила в отношении производительности, читаемости и выразительности. Однако есть небольшой нюанс в отношении NULL при использовании NOT IN, но эта тема выходит за рамки нашего урока.
CROSS JOIN
Этот оператор создает перекрестное произведение двух соединенных ссылок на таблицу, комбинируя каждую запись первой ссылки с записью второй ссылки на таблицу. Мы уже видели раньше, что это может быть достигнуто посредством ссылок на таблицы с разделителями-запятыми в предложении FROM. В редких случаях, когда это действительно необходимо, в большинстве диалектов SQL перекрестное соединение CROSS JOIN можно написать явным образом:
-- Объединить каждого автора с книгой
author CROSS JOIN book
DIVISION
Реляционное деление — вот кто настоящий зверь. В кратце, если JOIN это умножение, division (деление) — противоположность операции JOIN. Реляционные деления очень трудно выразить в SQL. Поскольку этот урок для начинающих, деление мы не рассматриваем. Для самых храбрых информация находится здесь, здесь и здесь.
Что мы из этого узнаем?
Много чего. В SQL повсюду ссылки на таблицы. Соединяемые таблицы представляют собой довольно сложные ссылки на таблицы. Но между реляционными выражениями и выражениями SQL есть разница. Не все операции реляционного соединения также являются формальными операциями соединения SQL. Имея немного практики и знаний в реляционной теории, вы всегда сможете выбрать верный тип реляционного соединения JOIN и правильно представить его на языке SQL.
7. Производные таблицы SQL похожи на табличные переменные
Раньше мы узнали, что SQL является декларативным языком, и не имеет переменных (хотя в некоторых диалектах SQL они существуют). Но можно написать нечто похожее на переменные. Эти звери называются производными таблицами.
Производная таблица — это не что иное, как вложенный запрос, заключенный в круглые скобки.
-- Производная таблица
FROM (SELECT * FROM author)
Обратите внимание, что некоторые диалекты SQL требуют, чтобы производные таблицы имели корреляционное имя (также называемое псевдонимом).
-- Производная таблица с псевдонимом
FROM (SELECT * FROM author) a
Производные таблицы великолепны, если необходимо обойти проблемы, вызванные логическим упорядочением предложений SQL. Например, если вы хотите повторно использовать выражение столбца в предложении SELECT и WHERE, просто напишите (диалект Oracle):
-- Получить имя и фамилию авторов и их возраст в днях
SELECT first_name, last_name, age
FROM (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
)
— Если возраст больше, чем 10000 дней
WHERE age > 10000
Обратите внимание, что некоторые базы данных и стандарт SQL:1999 подняли производные таблицы на следующий уровень введением обобщенных табличных выражений. Это позволит повторно использовать одну и ту же производную таблицу несколько раз в одной инструкции SQL SELECT. Приведенный выше запрос будет переведен на (почти) эквивалент:
WITH a AS (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
)
SELECT *
FROM a
WHERE age > 10000
Очевидно, что «a» можно также вывести в отдельное представление для более широкого использования общих подзапросов SQL. Подробнее о представлениях здесь.
Что мы из этого узнаем?
Снова, снова и снова. В SQL все завязано на ссылках, а не столбцах. Как этим воспользоваться. Не бойтесь написания производных таблиц или других сложных ссылок на таблицы.
8. SQL GROUP BY преобразует прежние ссылки на таблицу
Давайте вновь обсудим наше предложение FROM:
FROM a, b
А теперь к соединенной ссылке (см. выше) применим предложение GROUP BY
GROUP BY A.x, A.y, B.z
Предложение производит новую ссылку на таблицу только с тремя оставшимися столбцами (!). Попробуем это переварить. С применением GROUP BY, уменьшается число доступных столбцов во всех последующих логических предложениях, включая SELECT. Ссылаться только на столбцы из предложения GROUP BY в предложении SELECT можно по синтаксической причине.
Обратите внимание, что другие столбцы могут по-прежнему быть доступными в качестве аргументов агрегатных функций:
SELECT A.x, A.y, SUM(A.z)
FROM A
GROUP BY A.x, A.y
Следует заметить, что MySQL, к сожалению, не придерживается этого стандарта, отчего получается только путаница. Не попадайтесь на уловки в MySQL. GROUP BY преобразует ссылки на таблицу Таким образом, можно ссылаться только на столбцы, также упоминаемые в предложении GROUP BY.
Что мы из этого узнаем?
GROUP BY, опять же, работает с табличными ссылками, преобразовывая их в новую форму.
9. SQL SELECT в реляционной алгебре называется проекцией
Мне лично нравится термин «проекция», так как он используется в реляционной алгебре. После того как вы создали ссылку на таблицу, отфильтровали и преобразовали ее, можете переходить к проецированию в другую форму. Предложение SELECT подобно проектору. Табличная функция использующет выражение значения строки для преобразования каждой записи из ранее созданной ссылки на таблицу в конечный результат.
В предложении SELECT можно работать со столбцами, создавая сложные выражения столбцов как части записи/строки.
Есть много специальных правил в отношении характера доступных выражений, функций и т.д. Главное, нужно помнить следующее:
- Можно использовать только ссылки на столбцы, полученные из ссылки на таблицу в «output».
- Если у вас есть предложение GROUP BY, вы можете ссылаться только на столбцы из этого предложения или агрегатные функции.
- Если нет предложения GROUP BY вместо агрегатных можно использовать оконные функции.
- Если нет предложения GROUP BY, нельзя сочетать агрегатные и неагрегатные функции.
- Существуют некоторые правила, касающиеся переноса регулярных функций в агрегатные функции и наоборот.
Есть много сложных правил. Которыми можно заполнить еще один урок. Например, причина почему нельзя комбинировать агрегатные функции с неагрегатными функциями в проекции инструкции SELECT без предложения GROUP BY (правило № 4), такова:
- Это не имеет смысла. Интуитивно.
- Если не помогает интуиция (например, новичкам в SQL), выручают синтаксические правила. В SQL:1999 реализован оператор GROUPING SETS, а в SQL:2003 — пустой оператор grouping sets: GROUP BY (). Всякий раз, когда присутствует агрегатная функция и нет явного предложения GROUP BY, применяется неявный пустой GROUPING SET (правило №2). Следовательно, исходные правила о логическом упорядочении больше не являются верными, и проекция (SELECT) влияет на результат логически предшествующего, но лексически последовательного предложения (GROUP BY).
Запутались? Да. Я тоже. Давайте вернемся к более простым вещам.
Что мы из этого узнаем?
Предложение SELECT может быть одним из самых сложных предложений в SQL, даже если оно выглядит просто. Все другие предложения только переносят ссылки на таблицы от одного к другому. Предложение SELECT портит всю красоту этих ссылок, полностью их преобразовывая путем применения к ним правил.
Чтобы понять SQL, перед использованием оператора SELECT нужно усвоить все остальное. Даже если SELECT является первым предложением в лексической упорядоченности, он должен быть последним.
10. SQL DISTINCT, UNION, ORDER BY и OFFSET — намного проще
После сложного SELECT мы можем снова вернуться к простым истинам:
- Операции Set (DISTINCT и UNION)
- Операции упорядочивания (ORDER BY, OFFSET .. FETCH)
Операции Set
Операции set работают с наборами, которые на самом деле являются таблицами. Почти. Теоретически, это несложно понять.
- DISTINCT удаляет дубликаты после проекции.
- UNION объединяет два подзапроса и удаляет дубликаты
- UNION ALL объединяет два подзапроса, сохраняя дубликаты
- EXCEPT удаляет записи из первого подзапроса, которые также содержатся во втором подзапросе (и затем удаляет дубликаты)
- INTERSECT сохраняет только записи, содержащиеся в обоих поздапросах (а затем удаляет дубликаты)
Удаление дубликатов во всех этих случаях не имеет смысла. Для объединения подзапросов чаще всего следует применять UNION ALL.
Операции упорядочивания
Упорядочение не является реляционной функцией. Это функция, предназначенная только для SQL. Она применяется в самом конце лексического упорядочения и логического упорядочения инструкции SQL. Использование ORDER BY и OFFSET.. FETCH — это единственный способ гарантировать, что записи могут быть доступны по индексу надежным способом. Все остальные способы упорядочивания всегда произвольны и случайны, даже если они могут показаться воспроизводимыми.
OFFSET .. FETCH — это только один вариант синтаксиса. Другие варианты включают LIMIT, OFFSET в MySQL и PostgreSQL .. или TOP и START AT в SQL Server и Sybase.
Приступаем к работе
Как и в каждом языке, чтобы освоить SQL, требуется практика. 10 вышеупомянутых простых шагов помогут вам понять обычные операции SQL.
SQL GROUP BY, COUNT — с примерами
Какова цель предложения GROUP BY?
Предложение GROUP BY группирует записи в итоговые строки.
Он возвращает по одной записи для каждой группы.
Запросы GROUP BY часто включают агрегаты: COUNT, MAX, SUM, AVG и т. Д.
Предложение GROUP BY может группироваться по одному или нескольким столбцам.
Синтаксис SQL GROUP BY
Общий синтаксис:
ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов
Общий синтаксис ORDER BY:
ВЫБЕРИТЕ имена столбцов ОТ имя-таблицы ГДЕ условие ГРУППА ПО именам столбцов ЗАКАЗАТЬ ПО именам столбцов
КЛИЕНТ |
---|
Идентификатор |
Имя |
Фамилия |
Город |
Страна |
Телефон |
Примеры SQL GROUP BY
Задача: Укажите количество клиентов в каждой стране.
ВЫБЕРИТЕ COUNT (Id), Country ОТ Заказчика ГРУППА ПО СТРАНАМ
Результат: 21 запись.
Счетчик | Страна |
---|---|
3 | Аргентина |
2 | Австрия |
2 | Бельгия |
9 | Бразилия |
3 | Канада |
КЛИЕНТ |
---|
Идентификатор |
Имя |
Фамилия |
Город |
Страна |
Телефон |
Задача: Список клиентов
в каждой стране отсортировано по убыванию
ВЫБЕРИТЕ COUNT (Id), Country ОТ Заказчика ГРУППА ПО СТРАНАМ ORDER BY COUNT (Id) DESC
Результат: 21 запись.
Счетчик | Страна |
---|---|
13 | США |
11 | Франция |
11 | Германия |
9 | Бразилия |
7 | UK |
КЛИЕНТ |
---|
Идентификатор |
Имя |
Фамилия |
Город |
Страна |
Телефон |
ЗАКАЗ | ||
---|---|---|
Идентификатор | Дата заказа | |
Номер заказа | ||
CustomerId | ||
TotalAmount |
Задача: Укажите общую сумму заказа
для каждого покупателя
ВЫБЕРИТЕ СУММУ (О.TotalAmount) КАК SUM, C.FirstName, C.LastName FROM [Заказ] O ПРИСОЕДИНЯЙТЕСЬ к клиенту C ON O.CustomerId = C.Id ГРУППА ПО C.FirstName, C.LastName ЗАКАЗАТЬ ПО СУММЕ (O.TotalPrice) DESC
Этот запрос присоединяется к заказу с клиентом, чтобы получить имена клиентов.
Результат: 89 записей.
Сумма | Имя | Фамилия |
---|---|---|
117483.39 | Хорст | Клосс |
115673,39 | Jose | Паваротти |
113236,68 | Роланд | Мендель |
57317,39 | Патрисия | Маккенна |
52245.90 | Паула | Уилсон |
34101.15 | Марио | Понтов |
32555,55 | Мария | Ларссон |
SQLite Group By
Сводка : в этом руководстве вы узнаете, как использовать предложение SQLite GROUP BY
для создания набора итоговых строк из набора строк.
Введение в SQLite
Предложение GROUP BY
Предложение GROUP BY
является необязательным предложением оператора SELECT
. Предложение GROUP BY
объединяет выбранную группу строк в итоговые строки по значениям одного или нескольких столбцов.
Предложение GROUP BY
возвращает по одной строке для каждой группы. Для каждой группы вы можете применить агрегатную функцию, такую как MIN
, MAX
, SUM
, COUNT
или AVG
, чтобы предоставить дополнительную информацию о каждой группе.
Следующий оператор иллюстрирует синтаксис предложения SQLite GROUP BY
.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ столбец_1, агрегатная_функция (столбец_2) ИЗ Таблица ГРУППА ПО столбец_1, column_2;
Попробовать
Предложение GROUP BY
следует после предложения FROM
оператора SELECT
. Если оператор содержит предложение WHERE
, предложение GROUP BY
должно стоять после предложения WHERE
.
После предложения GROUP BY
следует столбец или список разделенных запятыми столбцов, используемых для определения группы.
SQLite
GROUP BY
примеров
Мы используем таблицу треков
из образца базы данных для демонстрации.
SQLite
Предложение GROUP BY
с функцией COUNT
Следующая инструкция возвращает идентификатор альбома и количество треков в альбоме. Он использует предложение GROUP BY
для группировки треков по альбомам и применяет функцию COUNT ()
к каждой группе.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ альбумид COUNT (trackid) ИЗ треки ГРУППА ПО альбумид;
Попробовать
Вы можете использовать предложение ORDER BY
для сортировки групп следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT альбумид COUNT (trackid) ИЗ треки ГРУППА ПО Albidid ЗАКАЗАТЬ ПО СЧЕТЧИКУ (trackid) DESC;
Попробовать
SQLite
GROUP BY
и INNER JOIN Предложение
Вы можете запрашивать данные из нескольких таблиц с помощью предложения INNER JOIN
, затем используйте предложение GROUP BY
, чтобы сгруппировать строки в набор итоговых строк.
Например, следующий оператор объединяет таблицу дорожек
с таблицей альбомов
для получения названий альбомов и использует предложение GROUP BY
с функцией COUNT
для получения количества дорожек в альбоме.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ треки. альбумид, заглавие, COUNT (trackid) ИЗ треки ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ к альбомам НА альбомах .albumid = track.albumid ГРУППА ПО track.albumid;
Попробовать
SQLite
GROUP BY
с HAVING
clause
Для фильтрации групп вы используете GROUP BY
с HAVING
clause .Например, чтобы получить альбомы, содержащие более 15 треков, используйте следующую инструкцию:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT треки. альбумид, заглавие, COUNT (trackid) ИЗ треки ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ к альбомам НА альбомах .albumid = track.albumid ГРУППА ПО track.albumid ИМЕЕТ СЧЕТ (trackid)> 15;
Попробовать
SQLite
Предложение GROUP BY
с примером функции SUM
Вы можете использовать функцию SUM
для расчета итогов по группе.Например, чтобы получить общую длину и байты для каждого альбома, вы используете функцию СУММ
для вычисления общего количества миллисекунд и байтов.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ альбумид SUM (миллисекунды) длина, SUM (байты) размер ИЗ треки ГРУППА ПО альбумид;
Попробовать
SQLite
GROUP BY
с функциями MAX
, MIN
и AVG
Следующая инструкция возвращает идентификатор альбома , название альбома, максимальная длина, минимальная длина и средняя длина треков в таблице треков
.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ треки. альбумид, заглавие, мин (миллисекунды), макс (миллисекунды), round (avg (миллисекунды), 2) ИЗ треки ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ к альбомам НА альбомах .albumid = track.albumid ГРУППА ПО track.albumid;
Попробовать
SQLite
GROUP BY
пример нескольких столбцов
В предыдущем примере мы использовали один столбец в предложении GROUP BY
. SQLite позволяет группировать строки по нескольким столбцам.
Например, чтобы сгруппировать треки по типу мультимедиа и жанру, вы используете следующий оператор:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT MediaTypeId, GenreId, COUNT (TrackId) ИЗ треки ГРУППА ПО MediaTypeId, GenreId;
Попробовать
SQLite использует комбинацию значений MediaTypeId
и GenreId
столбцов в виде группы, например (1,1) и (1 , 2). Затем он применяет функцию COUNT
, чтобы вернуть количество треков в каждой группе.
SQLite
GROUP BY
, пример даты
См. Следующую таблицу накладных из образца базы данных:
Следующая инструкция возвращает количество накладных по годам.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ STRFTIME ('% Y', InvoiceDate) InvoiceYear, COUNT (InvoiceId) InvoiceCount ИЗ счета ГРУППА ПО STRFTIME ('% Y', InvoiceDate) СОРТИРОВАТЬ ПО InvoiceYear;
Вот результат:
В этом примере:
- Функция
STRFTIME ('% Y', InvoiceDate)
возвращает год от строка даты. - Предложение
GROUP BY
группирует счета по годам. - Функция
COUNT ()
возвращает количество счетов за каждый год (или группу).
В этом руководстве вы узнали, как использовать предложение SQLite GROUP BY
для группировки строк в набор итоговых строк.
Было ли это руководство полезным?
Предложение SQL GROUP BY
Предложение SQL GROUP BY используется для возврата агрегированных данных путем группирования одного или нескольких столбцов и выполняет агрегированные функции для остальных столбцов.Например, если вы хотите узнать общее количество продаж по региону или стране, используйте SQL Group By Clause, чтобы сгруппировать таблицу продаж по региону или стране. Затем мы можем использовать агрегатную функцию SUM для вычисления итоговой суммы.
Синтаксис предложения SQL GROUP BY
Синтаксис оператора SELECT с условием Group By в SQL Server
- Синтаксис SQL Server Group By Clause ВЫБЕРИТЕ [Столбец1], [Столбец2] ... [СтолбецN], Агрегатная функция (выражение | имя_столбца) ОТ [Источник] ГДЕ [Условия] - Необязательно ГРУППА ПО [Столбец1], [Столбец2]... [СтолбецN] ORDER BY Columns
Columns позволяет нам ВЫБРАТЬ количество столбцов из таблиц, и это может быть один или несколько столбцов. Мы можем использовать любые агрегатные функции, такие как SUM, MIN, AVG, MAX и COUNT. Источник может быть одним или несколькими, и использовать объединения для объединения нескольких таблиц.
Условия: Предоставьте фильтры или условия. Если условие истинно, то только инструкция SELECT возвращает записи. Группировать по: все выбранные столбцы, которые не являются частью функций агрегирования, должны быть помещены после этого предложения «Группировать по».
Если вы хотите отображать агрегированную информацию для конечного пользователя, используйте предложение Group by. В этой статье показано использование SQL Group By для группировки данных и агрегирования при их извлечении с помощью оператора SELECT. Мы используем данные ниже, чтобы объяснить пункт «Группировать по».
SQL Group By Count с использованием одного столбца
В этом примере мы используем один столбец в предложении Group By. Следующий запрос группы по подсчету будет подсчитывать общее количество идентификаторов сотрудников в образовательной группе.
ИСПОЛЬЗОВАНИЕ [Учебное пособие по SQL] ИДТИ ВЫБЕРИТЕ образование, COUNT ([EmpID]) AS [Всего идентификаторов] ОТ [Заказчик] ГРУППА ПО ОБРАЗОВАНИЮ
Группа SQL по нескольким столбцам
Использование нескольких столбцов, таких как образование и род занятий, в разделе «Группировать по».
ИСПОЛЬЗОВАНИЕ [Учебное пособие по SQL] ИДТИ ВЫБЕРИТЕ образование, [Занятие], COUNT ([EmpID]) AS [Всего идентификаторов] ОТ [Заказчик] ГРУППА ПО образованию, профессии
Если вы посмотрите на приведенный выше снимок экрана SQL Server, несмотря на то, что мы сгруппированы по профессии, значения столбцов повторяются.Это потому, что здесь мы использовали два столбца («Род занятий» и «Образование») в группе по утверждению. Люди, получившие степень бакалавра, работают в сфере менеджмента, и лишь немногие работают в профессиональной сфере.
SQL Пример 1 группы по сумме
Здесь мы используем функцию Sum в одном столбце в предложении Group By. Следующая группа по запросу рассчитает общий доход каждого отдела.
- Пример группы SQL Server по сумме ИСПОЛЬЗУЙТЕ [Учебное пособие по SQL] ИДТИ ВЫБЕРИТЕ [Профессия], СУММ (годовой доход) КАК [Общий доход] ОТ [Заказчик] ГРУППА ПО профессии
Пример 2 группы по сумме
Использование функции суммы и нескольких столбцов в предложении «Группировать по».
- Пример группы SQL Server по сумме ИСПОЛЬЗУЙТЕ [Учебное пособие по SQL] ИДТИ ВЫБЕРИТЕ [Профессия], Образование, СУММ (годовой доход) КАК [Общий доход] ОТ [Заказчик] GROUP BY Occupation, Education
Group By Where Clause
Мы также можем использовать предложение Where вместе с предложением Group By в Sql Server.
- Пример группы SQL Server ВЫБЕРИТЕ [Профессия] ,[Образование] , SUM ([Годовой доход]) КАК [Общий доход] ОТ [Заказчик] ГДЕ [Профессия] <> «Квалифицированное руководство» GROUP BY [Профессия], [Образование]
SQL Group By Order By Example
Вы также можете использовать предложение Order By вместе с Group By.
- Пример группы SQL Server ВЫБЕРИТЕ [Профессия] ,[Образование] , SUM ([Годовой доход]) КАК [Общий доход] , SUM (Продажи) КАК [Всего продаж] ОТ [Заказчик] ГДЕ [Профессия] <> «Квалифицированное руководство» ГРУППА ПО [Профессия], [Образование] ORDER BY SUM ([YearlyIncome]) DESC
SQL Group By Aggregate Functions
В этом примере группы по предложениям мы собираемся использовать агрегатные функции SUM, AVG, MIN и MAX в одном операторе SELECT.
- Пример группы SQL Server ВЫБЕРИТЕ [Профессия] , SUM ([Годовой доход]) КАК [Общий доход] , AVG ([Годовой доход]) AS [Средний доход] , MIN ([Годовой доход]) КАК [Минимальная продажа] , MAX ([Годовой доход]) КАК [Максимальная продажа] ОТ [Заказчик] ГРУППА ПО [профессии] ЗАКАЗАТЬ ПО [Профессии]
ПРИМЕЧАНИЕ. Если вы забыли ИМЯ столбца ALIAS, то в качестве текста заголовка будет отображаться [Без имени столбца].
Предложение SQL Group By Top
Здесь предложение Group By используется для группировки по роду занятий и образованию, а предложение Top — для выбора первых 6 записей.
- Пример группы SQL Server ВЫБЕРИТЕ ТОП 6 [Профессия], Образование, СУММ (годовой доход) КАК [Общий доход], СУММ (Продажи) КАК [Всего продаж] ОТ [Заказчик] ГРУППА ПО профессии, образованию ORDER BY SUM (Годовой доход) DESC
Группа SQL по примеру
Оператор Group By сгруппирует клиентов по роду занятий и образованию.Затем предложение Have вернет результат группы, сумма годового дохода которого превышает 60000.
- SQL Server Group By Example ВЫБЕРИТЕ [Профессия], Образование, СУММ (годовой доход) КАК [Общий доход], СУММ (Продажи) КАК [Всего продаж] ОТ [Заказчик] ГРУППА ПО профессии, образованию ИМЕЕТ СУММУ ([Годовой доход])> 60000 ORDER BY SUM (YearlyIncome) DESC
Группировать по сложному примеру
Объединение всех возможностей, которые вы можете использовать вместе с предложением Group By.
ИСПОЛЬЗОВАНИЕ [Учебное пособие по SQL] ИДТИ ВЫБЕРИТЕ [Профессия], Образование, СУММ (годовой доход) КАК [Общий доход], СУММ (Продажи) КАК [Всего продаж] ОТ [Заказчик] ГДЕ [Образование] <> 'Неполная средняя школа' ГРУППА ПО профессии, образованию ИМЕЕТ СУММУ ([Годовой доход])> 60000 ORDER BY Профессия, образование
Как агрегировать данные с помощью Group By в SQL
SQL позволяет пользователю хранить более 30 типов данных в необходимом количестве столбцов, поэтому иногда становится трудно найти похожие данные в этих столбцах .Group By в SQL помогает нам объединить идентичные строки, присутствующие в столбцах таблицы. Это важное утверждение в SQL, поскольку оно предоставляет нам аккуратный набор данных, позволяя суммировать важные данные, такие как продажи, стоимость и зарплата.
В этой статье об операторе SQL Group By мы рассмотрим следующие темы:
- Что такое группировка в SQL?
- Синтаксис для использования Group By в SQL
- Агрегатные функции
- Использование Group By для одного столбца
- Использование группировки по нескольким столбцам
- Использование предложения Have с Group By
Что такое группировка в SQL?
Оператор Group By используется для группировки любых строк столбца с одинаковым значением, хранящимся в них, на основе функции, указанной в операторе.Как правило, эти функции являются одной из агрегатных функций, таких как MAX () и SUM (). Этот оператор используется с командой SELECT в SQL.
Оператор SQL Group By использует стратегию разделения-применения-объединения.
- Разделить: разные группы разделены по своим значениям.
- Применить: агрегатная функция применяется к значениям этих групп.
- Объединить: значения объединяются в одну строку.
Агрегатная функция SUM (), которая вычисляет арифметическую сумму значений строк, была применена к группам на приведенном выше рисунке.
Чтобы лучше понять, как используется SQL Order By, давайте разберемся в синтаксисе этого оператора.
Магистерская программа для бизнес-аналитиков
Получите опыт работы с инструментами бизнес-аналитикиПросмотрите программу
Синтаксис для использования Group By в SQL
ВЫБРАТЬ столбец_1, имя_функции (столбец_2) ИЗ имя_таблицы ГДЕ [состояние] GROUP BY имя_столбца ORDER BY имя_столбца; |
- Получаемые столбцы указываются в операторе SELECT и разделяются запятыми.Любую из агрегатных функций можно использовать для одного или нескольких извлекаемых столбцов.
- Используемая таблица указана в параметре table_name оператора FROM.
- Существует необязательное предложение WHERE, которое можно использовать для указания любого условия, в соответствии с которым должны быть выбраны строки.
ПРИМЕЧАНИЕ. Предложение WHERE всегда предшествует оператору ORDER BY.
- Оператор GROUP BY сообщает системе базы данных, что мы хотим сгруппировать строки с одинаковыми значениями столбцов, указанных в параметре column_names этого оператора.
- Необязательный оператор ORDER BY используется для сортировки результирующей таблицы в порядке возрастания на основе столбца, указанного в параметре имя_столбца этого оператора.
ПРИМЕЧАНИЕ. Оператор ORDER BY всегда появляется после оператора GROUP BY и применяется к сформированным группам строк.
Агрегатные функции — одна из самых важных частей оператора SQL Group By, поэтому давайте посмотрим, что это такое.
Агрегатные функции
Пять агрегатных функций, которые мы можем использовать с оператором SQL Order By:
- AVG (): вычисляет среднее значение набора значений.
- COUNT (): возвращает количество строк.
- SUM (): вычисляет арифметическую сумму набора числовых значений.
- MAX (): из группы значений возвращает максимальное значение.
- MIN (): из группы значений возвращает минимальное значение.
Давайте применим изложенные выше концепции к столбцам таблицы, чтобы получить еще более четкое представление о выражении Group By.
Использование Group By в одном столбце
Возьмем для примера таблицу Employee_dept:
- В этой таблице, чтобы найти среднюю зарплату сотрудников каждого отдела, мы будем использовать следующий запрос:
Для этой цели мы использовали агрегатную функцию AVG ().
Это приведет к следующей таблице:
Не было предложения ORDER BY, поэтому в таблице нет определенного порядка строк.
- Давайте посмотрим, что происходит, когда мы используем предложение ORDER BY.
Чтобы найти количество сотрудников из каждого города, необходимо:
И это приведет к следующей таблице:
Как мы видим, группы упорядочены по возрастанию, согласно количеству сотрудников в каждом городе.
- Предложение WHERE также может использоваться в запросе, и оно предшествует оператору GROUP BY. Давайте посмотрим на пример.
Чтобы найти максимальную зарплату для каждого отдела с «Dept_ID» больше 1003:
Предложение WHERE будет применено к строкам до их группировки.
Результатом вышеуказанного запроса будет следующее:
- Давайте посмотрим, что произойдет, если мы используем агрегатную функцию без оператора GROUP BY.
Чтобы узнать общую зарплату всех сотрудников:
Как мы видим, функция подсчета в «Dept_ID» возвращает общее количество записей в таблице, а функция суммы в «Зарплата» возвращает арифметическую сумму зарплат всех сотрудников.
Оператор SQL Group By может применяться к нескольким столбцам таблицы в одном запросе. Посмотрим, как это делается.
Введение в аналитику данных (БЕСПЛАТНО)
Освоение основ аналитики данных на расстоянии одного клика! Начать обучение
Использование группировки по нескольким столбцам
В таблице «Employee_dept», чтобы найти количество сотрудников из каждого города во всех отделах, мы воспользуемся следующим запросом:
Как мы видим, GROUP BY применяется к двум столбцам.
Это приведет к следующей таблице:
Как мы видим, каждая комбинация города и отдела представлена в таблице, и количество сотрудников для каждой из этих комбинаций было вычислено.
Использование предложения Have с Group By
Предложение WHERE нельзя использовать для фильтрации сгруппированных строк на основе условия. Для этого у нас есть предложение HAVING. Синтаксис для использования этого предложения:
ВЫБРАТЬ столбец_1, функция (столбец_2) ИЗ имя_таблицы ГДЕ [состояние] GROUP BY имена_столбцов ИМЕЕТ [состояние] ORDER BY имена_столбцов; |
Предложение HAVING всегда предшествует оператору ORDER BY в запросе.
В таблице «Employee_dept» мы воспользуемся следующим запросом, чтобы найти города с несколькими сотрудниками.
Как мы видим, к группе городов, сформированной оператором GROUP BY, применено условие. В результате получится следующее:
Возвращаются только города с несколькими сотрудниками.
На этом мы подошли к концу статьи о популярном утверждении Group By.
Получите знания о новейших инструментах и методах бизнес-аналитики с помощью программы последипломного образования в области бизнес-анализа.Запишитесь сейчас!
Следующие шаги
Агрегирование или резюмирование данных — одна из самых важных задач и навыков для любого, кто управляет данными. От отчетов о прибылях и убытках до создания идеальной визуализации данных — SQL Group By — это инструмент, который позволяет нам эффективно выполнять подобные задачи.
Теперь, когда вы знаете, как агрегировать и резюмировать данные, пришло время начать запрашивать, обрабатывать и визуализировать все виды данных, чтобы продвинуться вперед на пути к тому, чтобы стать экспертом в SQL.Если вам понравилась эта статья и вы хотите пройти сертификацию, ознакомьтесь с нашей магистерской программой для бизнес-аналитиков, поскольку она также поможет вам изучить основы SQL.
У вас есть к нам вопросы? Пожалуйста, упомяните их в разделе комментариев нашей статьи «Как агрегировать данные с помощью группировки в SQL», и наши специалисты в этой области сразу же ответят на них!
sql — Использование группы по нескольким столбцам
Здесь я собираюсь объяснить не только использование предложения GROUP, но и использование агрегатных функций.
Предложение GROUP BY
используется вместе с агрегатными функциями для группировки набора результатов по одному или нескольким столбцам. например:
- GROUP BY с одним параметром:
ВЫБЕРИТЕ имя_столбца, AGGREGATE_FUNCTION (имя_столбца)
FROM table_name
WHERE column_name значение оператора
ГРУППА ПО имя_столбца;
- GROUP BY с двумя параметрами:
ВЫБРАТЬ
column_name1,
column_name2,
AGGREGATE_FUNCTION (имя_столбца3)
ИЗ
table_name
ГРУППА ПО
column_name1,
column_name2;
Запомните этот заказ:
SELECT (используется для выбора данных из базы данных)
FROM (раздел используется для перечисления таблиц)
WHERE (предложение используется для фильтрации записей)
GROUP BY (предложение может использоваться в инструкции SELECT для сбора данных
по нескольким записям и сгруппируйте результаты по одному или нескольким столбцам)HAVING (предложение используется в сочетании с предложением GROUP BY для
ограничить группы возвращаемых строк только теми, для которых условие
ИСТИНА)ORDER BY (ключевое слово используется для сортировки набора результатов)
Вы можете использовать все это, если используете агрегатные функции, и это порядок, в котором они должны быть установлены, иначе вы можете получить ошибку.
Агрегатные функции:
MIN () возвращает наименьшее значение в заданном столбце
MAX () возвращает максимальное значение в данном столбце.
SUM () возвращает сумму числовых значений в данном столбце
AVG () возвращает среднее значение данного столбца
COUNT () возвращает общее количество значений в данном столбце
COUNT (*) возвращает количество строк в таблице
Примеры сценариев SQL об использовании агрегатных функций:
Допустим, нам нужно найти заказы на продажу, общая сумма продаж которых превышает 950 долларов.Мы объединяем предложение HAVING
и предложение GROUP BY
, чтобы добиться этого:
ВЫБРАТЬ
orderId, SUM (unitPrice * qty) Итого
ИЗ
Информация для заказа
ГРУППА ПО orderId
ИМЕЕТ Всего> 950;
Подсчет всех заказов и их группировка по идентификатору клиента и сортировка результата по возрастанию. Мы объединяем функцию COUNT
и предложения GROUP BY
, ORDER BY
и ASC
:
ВЫБРАТЬ
customerId, COUNT (*)
ИЗ
Заказы
ГРУППА ПО customerId
ЗАКАЗАТЬ ПО СЧЕТЧИКУ (*) ASC;
Получите категорию, в которой средняя цена за единицу превышает 10 долларов США, используя функцию AVG
в сочетании с GROUP BY
и HAVING
clauses:
ВЫБРАТЬ
categoryName, AVG (unitPrice)
ИЗ
Продукция p
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Категории c ON c.categoryId = p.categoryId
ГРУППА ПО КАТЕГОРИИ
ИМЕТЬ СРЕДНЕЕ (unitPrice)> 10;
Получение менее дорогого продукта по каждой категории с помощью функции MIN
в подзапросе:
ВЫБРАТЬ идентификатор категории,
идантификационный номер продукта,
наименование товара,
Цена за единицу
ИЗ ПРОДУКТОВ p1
ГДЕ unitPrice = (
ВЫБЕРИТЕ МИН (unitPrice)
ИЗ ПРОДУКТОВ p2
ГДЕ p2.categoryId = p1.categoryId)
Следующий оператор группирует строки с одинаковыми значениями в categoryId и productId столбцов:
ВЫБРАТЬ
categoryId, categoryName, productId, SUM (unitPrice)
ИЗ
Продукция p
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Категории c ON c.categoryId = p.categoryId
ГРУППА ПО categoryId, productId
SQL ГРУППА ПО | Средний уровень SQL
Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.
В этом уроке мы рассмотрим:
Предложение SQL GROUP BY
Агрегатные функции
SQL, такие как COUNT
, AVG
и SUM
, имеют нечто общее: все они агрегируют по всей таблице.Но что, если вы хотите агрегировать только часть таблицы? Например, вы можете захотеть подсчитать количество записей за каждый год.
В подобных ситуациях вам нужно использовать предложение GROUP BY
. GROUP BY
позволяет разделять данные на группы, которые можно агрегировать независимо друг от друга. Вот пример с использованием набора данных о ценах на акции Apple:
ВЫБРАТЬ год,
COUNT (*) AS count
ИЗ tutorial.aapl_historical_stock_price
ГРУППА ПО ГОДУ
Вы можете группировать по нескольким столбцам, но вы должны разделять имена столбцов запятыми — как в случае с ORDER BY
):
ВЫБРАТЬ год,
месяц,
COUNT (*) AS count
ИЗ учебника.aapl_historical_stock_price
ГРУППА ПО году, месяцу
Практическая задача
Подсчитайте общее количество акций, торгуемых каждый месяц. Отсортируйте результаты в хронологическом порядке.
Попробуй это
Посмотреть ответ
ГРУППА ПО номерам столбцов
Как и в случае с ORDER BY
, вы можете заменить имена столбцов числами в предложении GROUP BY
. Обычно рекомендуется делать это только тогда, когда вы группируете много столбцов или если что-то еще приводит к тому, что текст в предложении GROUP BY
становится чрезмерно длинным:
ВЫБРАТЬ год,
месяц,
COUNT (*) AS count
ИЗ учебника.aapl_historical_stock_price
ГРУППА ПО 1, 2
Примечание: эта функция (нумерация столбцов вместо использования имен) поддерживается Mode, но не всеми разновидностями SQL, поэтому, если вы используете другую систему или подключены к определенным типам баз данных, она может не работать.
Использование GROUP BY с ORDER BY
Порядок имен столбцов в предложении GROUP BY
не имеет значения — результаты будут одинаковыми независимо. Если вы хотите контролировать группировку агрегатов, используйте ORDER BY
.Попробуйте выполнить приведенный ниже запрос, затем поменяйте местами имена столбцов в инструкции ORDER BY
и посмотрите, как это выглядит:
ВЫБРАТЬ год,
месяц,
COUNT (*) AS count
ИЗ tutorial.aapl_historical_stock_price
ГРУППА ПО году, месяцу
ЗАКАЗАТЬ ПО месяцу, году
Использование GROUP BY с LIMIT
При группировке по нескольким столбцам следует помнить об одном: SQL оценивает агрегаты до предложения LIMIT
. Если вы не сгруппируете по столбцам, вы получите результат с одной строкой — никаких проблем.Если вы группируете по столбцу с достаточным количеством уникальных значений, превышающим число LIMIT
, агрегаты будут вычислены, а затем некоторые строки будут просто исключены из результатов.
На самом деле это хороший способ делать что-то, потому что вы знаете, что получите правильные агрегаты. Если SQL сокращает таблицу до 100 строк, а затем выполняет агрегирование, ваши результаты будут существенно другими. Результаты приведенного выше запроса превышают 100 строк, так что это прекрасный пример. Попробуйте снять ограничение и запустить его снова, чтобы увидеть, что изменится.
Отточите свои навыки работы с SQL
Практическая задача
Напишите запрос для расчета среднесуточного изменения цен на акции Apple, сгруппированных по годам.
Попробуй это
Посмотреть ответ
Практическая задача
Напишите запрос, который вычисляет самые низкие и самые высокие цены, достигнутые акциями Apple за каждый месяц.
Попробуй это
Посмотреть ответ
Предложение
Group By в SQL
Предложение
Group by используется для группировки результатов запроса SELECT
на основе одного или нескольких столбцов.Он также используется с функциями SQL для группировки результатов из одной или нескольких таблиц.
Синтаксис для использования Group by в операторе.
ВЫБРАТЬ имя_столбца, функция (имя_столбца)
FROM table_name
ГДЕ условие
GROUP BY имя_столбца
Пример
Группировать по
в выписке
Рассмотрим следующую таблицу Emp .
eid | имя | возраст | зарплата |
---|---|---|---|
401 | Ану | 22 | 9000 |
402 | Шейн | 29 | 8000 |
403 | Рохан | 34 | 6000 |
404 | Scott | 44 | 9000 |
405 | Tiger | 35 | 8000 |
Здесь мы хотим найти имя и возраст из сотрудников, сгруппированных по их зарплатам или, другими словами, мы будем группировать сотрудников на основе их зарплат, следовательно, в результате мы получим набор данных с указанием уникальных зарплат, а также имени и возраста первого сотрудника, который должен иметь эта зарплата.Надеюсь, вы уловили суть!
group by
используется для группировки различных строк данных вместе на основе любого одного столбца.
SQL-запрос для вышеуказанного требования будет:
ВЫБЕРИТЕ имя, возраст
ИЗ Emp GROUP ПО заработной плате
Результат будет,
имя | возраст |
---|---|
Рохан | 34 |
Шейн | 29 |
Ану | 22 |
Пример
Group by
в заявлении с WHERE
clause
Рассмотрим следующую таблицу Emp
eid | имя | возраст | зарплата |
---|---|---|---|
401 | Ану | 22 | 9000 |
402 | Шейн | 29 | 8000 |
403 | Рохан | 34 | 6000 |
404 | Scott | 44 | 9000 |
405 | Tiger | 35 | 8000 |
Запрос SQL будет,
ВЫБЕРИТЕ ФИО, заработную плату
ОТ Emp
ГДЕ возраст> 25
ГРУППА ПО заработной плате
Результат будет.