Group by по двум полям: Как в данной ситуации сделать GROUP BY по двум полям? | PHPClub
Группировка по нескольким столбцам
Группировка по нескольким столбцам
Группировка
по нескольким столбцам
В предложениях 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 — группировка при выборке из базы данных
Команда GROUP BY позволяет группировать результаты при выборке
из базы данных.
К сгруппированным результатам можно применять любые функции
(смотрите примеры).
См. также команду HAVING,
которая позволяет накладывать условие на группы, созданные с помощью GROUP BY.
Синтаксис
SELECT * FROM имя_таблицы WHERE условие GROUP BY поле_для_группировки
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 100 |
2 | Петя | 23 | 200 |
3 | Вася | 23 | 300 |
4 | Коля | 24 | 1000 |
5 | Иван | 24 | 2000 |
6 | Кирилл | 25 | 1000 |
Пример
В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет).
Затем для каждой группы применяется функция SUM,
которая суммирует зарплаты внутри данной группы.
В результате для каждой из групп (23 года, 24 года и 25 лет) будет подсчитана суммарная
зарплата внутри этой группы:
SELECT age, SUM(salary) as sum FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 600 |
24 | 3000 |
25 | 1000 |
Пример
В данном примере мы используем дополнительное условие WHERE,
чтобы взять не все записи из таблицы:
SELECT age, SUM(salary) as sum FROM workers WHERE id>=2 GROUP BY age
SQL запрос выберет следующие строки:
age возраст | sum сумма |
---|---|
23 | 500 |
24 | 3000 |
25 | 1000 |
Пример
В данном примере записи группируются по возрасту (будет 3 группы — 23 года, 24 года и 25 лет).
Затем для каждой группы применяется функция MAX,
которая находит максимальную зарплату внутри данной группы:
SELECT age, MAX(salary) as max FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | max максимальная зарплата |
---|---|
23 | 300 |
24 | 2000 |
25 | 1000 |
Пример
А теперь с помощью функции MIN
найдется минимальная зарплата внутри данной группы:
SELECT age, MIN(salary) as min FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | min минимальная зарплата |
---|---|
23 | 100 |
24 | 1000 |
25 | 1000 |
Пример
А теперь с помощью функции COUNT
найдется количество записей в группе:
SELECT age, COUNT(*) as count FROM workers GROUP BY age
SQL запрос выберет следующие строки:
age возраст | count количество |
---|---|
23 | 3 |
24 | 2 |
25 | 1 |
GROUP BY по двум полям (MySQL)
GANJAR
В таблице есть поля email и email_rec.
нужно сделать GROUP BY так, что бы в результат был количеством записей из данными
типа:
email — email_rec
email_rec — email
То есть по 2-м полям группировка.
В результат должны попасть как входящие так и исходящие сообщения. На первый взгляд показалось все довольно просто, а сейчас уже более 5ти ч. И ни в какую…
Дополнено (1). Есть 2 поля: получатель и отправитель. Нужно получить количество записей входящих и исходящих сообщений.
То есть
-значение первой записи получатель [email protected] а отправитель [email protected]
-второй — получатель [email protected] а отправитель [email protected]
В итоге они должны быть подсчитаны COUNT(*) AS ‘count_msg’
А как сам запрос группировки составить я без понятия…
Дополнено (2). |277|21|21|0|0|[email protected]| | |etsets|1297930874|1|0| |[email protected]|1
|387|21|21|0|103241|[email protected]|Богдан| |qweqwe|1298387575|1|1| |[email protected]|1
|402|21|21|0|103241|[email protected]|Богдан| |tsetseet|1298455480|1|0| |[email protected]|1
В результате должно получится 2 и 1
Потому как 3 строка в поле получатель содержит другой email
Групировка по 2м полям когда отправитель и получатель должны попасть в один результат.
Дополнено (3). Psevdonim, так я первым делом и сделал сначала, но результат не тот который мне нужно. Мне нужно подсчитать как исходящие так и входящие сообщения. А группировка по 2м полям даст лишь подсчет либо входящих либо исходящих. Так как во входящих сообщениях email отправителя = email получателя, в исходящих соответственно наоборот. В этом и вся сложность
Дополнено (4). Решение найдено.
GROUP BY IF(’email’=»‘.$mail_acc[’email’].'», ’email_rec’, ’email’)
Спасибо всем отписавшимся.
ИгоряN
Если я правильно понял, то у тебя с тем что ты хочешь получится то количество записей которое есть в базе и никакой групировки не выйдет, тебе надо два запроса писать
Иван Говно
Я ничего не понял.
upd. Каждому реальному письму соответсвует две записи в таблице?
Все равно не понятно. Давай напримере. Список писем, что в таблице и что должно быть в результате.
Psevdonim
SELECT count(*) AS ‘count_msg’, email, email_rec
FROM
GROUP BY email, email_rec
;
В чём проблемы-то?
Transact-SQL группировка данных GROUP BY | Info-Comp.ru
Мы с Вами рассмотрели много материала по 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. Таблица и данные конечно выдуманные, чисто для примера.
Создаем таблицу
CREATE TABLE [dbo].[test_table]( [id] [int] NULL, [name] [varchar](50) NULL, [summa] [money] NULL, [priz] [int] NULL ) ON [PRIMARY] GO
Я ее заполнил следующими данными:
Где,
- Id –идентификатор записи;
- Name – фамилия сотрудника;
- Summa- денежные средства;
- Priz – признак денежных средств (допустим 1- Оклад; 2-Премия).
Группируем данные с помощью запроса group by
И в самом начале давайте разберем синтаксис group by, т.е. где писать данную конструкцию:
Синтаксис:
Select агрегатные функции
From источник
Where Условия отбора
Group by поля группировки
Having Условия по агрегатным функциям
Order by поля сортировки
Теперь если нам необходимо просуммировать все денежные средства того или иного сотрудника без использования группировки мы пошлем вот такой запрос:
SELECT SUM(summa)as summa FROM test_table WHERE name='Иванов'
А если нужно просуммировать другого сотрудника, то мы просто меняем условие. Согласитесь, если таких сотрудников много, зачем суммировать каждого, да и это как-то не наглядно, поэтому нам на помощь приходит оператор group by. Пишем запрос:
SELECT SUM(summa)as summa, name FROM test_table GROUP BY name
Как Вы заметили, мы не пишем никаких условий, и у нас отображаются сразу все сотрудники с просуммированным количеством денежных средств, что более наглядно.
Примечание! Сразу отмечу то, что, сколько полей мы пишем в запросе (т.е. поля группировки), помимо агрегатных функций, столько же полей мы пишем в конструкции group by. В нашем примере мы выводим одно поле, поэтому в group by мы указали только одно поле (name), если бы мы выводили несколько полей, то их все пришлось бы указывать в конструкции group by (в последующих примерах Вы это увидите).
Также можно использовать и другие функции, например, подсчитать сколько раз поступали денежные средства тому или иному сотруднику с общей суммой поступивших средств. Для этого мы кроме функции sum будем еще использовать функцию count.
SELECT SUM(summa)as [Всего денежных средств], COUNT(*) as [Количество поступлений], Name [Сотрудник] FROM test_table GROUP BY name
Но допустим для начальства этого недостаточно, они еще просят, просуммировать также, но еще с группировкой по признаку, т.е. что это за денежные средства (оклад или премия), для этого мы просто добавляем в группировку еще одно поле, и для лучшего восприятия добавим сортировку по сотруднику, и получится следующее:
SELECT SUM(summa)as [Всего денежных средств], COUNT(*) as [Количество поступлений], Name [Сотрудник] , Priz [Источник] FROM test_table GROUP BY name, priz ORDER BY name
Теперь у нас все отображается, т.е. сколько денег поступило сотруднику, сколько раз, а также из какого источника.
А сейчас для закрепления давайте напишем еще более сложный запрос с группировкой, но еще добавим названия этого источника, так как согласитесь по идентификаторам признака не понятно из какого источника поступили средства. Для этого мы используем конструкцию case.
SELECT SUM(summa) AS [Всего денежных средств], COUNT(*) AS [Количество поступлений], Name [Сотрудник], CASE WHEN priz = 1 then 'Оклад' WHEN priz = 2 then 'Премия' ELSE 'Без источника' END AS [Источник] FROM test_table GROUP BY name, priz ORDER BY name
Вот теперь все достаточно наглядно и не так уж сложно, даже для начинающих.
Также давайте затронем условия по итоговым результатам агрегатных функций (having). Другими словами, мы добавляем условие не по отбору самих строк, а уже на итоговое значение функций, в нашем случае это sum или count. Например, нам нужно вывести все то же самое, но только тех, у которых «всего денежных средств» больше 200. Для этого добавим условие having:
SELECT SUM(summa)as [Всего денежных средств], COUNT(*) as [Количество поступлений], Name [Сотрудник], CASE WHEN priz = 1 then 'Оклад' WHEN priz = 2 then 'Премия' ELSE 'Без источника' END AS [Источник] FROM test_table GROUP BY name, priz --группируем HAVING SUM(summa) > 200 --отбираем ORDER BY name -- сортируем
Теперь у нас вывелись все значения sum(summa), которые больше 200, все просто.
Заметка! Для профессионального изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL.
Надеюсь, после сегодняшнего урока Вам стало понятно, как и зачем использовать конструкцию group by. Удачи! А SQL мы продолжим изучать в следующих статьях.
Нравится2Не нравится
Группировка записей
Группировка записей
Группировка записей
Конструкция GROUP BY в команде выборки позволяет разделить записи БД
слоя на группы. Группировка записей может выполняться по значениям одного или нескольких
полей записей, либо на основании значений столбцов таблицы результатов выборки.
Формат конструкции: GROUP BY
<поля данных>|<номера столбцов>
. При задании названии полей
данных группировка выполняется по полям данных таблицы, если же номера столбцов — то по
номерам столбцов выводимой таблицы (нумерация столбцов начинается с 1).
В команде выборки конструкция GROUP BY размещается непосредственно
после конструкции WHERE, перед HAVING и
ORDER.
Группировка записей всегда используется совместно с агрегирующими функциями. В таком
случае агрегирующие функции применяются отдельно к каждой группе записей. Например, при
группировке записей слоя Здания
по полю Улица
, все
записи БД слоя будут разбиты на несколько групп, в каждой группе записи с одинаковой улицей.
И, при применении функции COUNT в таком запросе, будет выведено
количество записей в каждой группе.
Группировка одновременно может выполняться по нескольким полям (столбцам). Поля
(столбцы) группировки перечисляются через запятую, после слов GROUP BY.
Группировка сначала выполняется по первому полю, затем, уже сгруппированные записи
разбиваются на подгруппы по второму полю и т.д.
При использовании в запросе группировки, среди выводимых столбцов выборки могут
задаваться агрегирующие функции, и поля записей по которым выполняется группировка, либо
выражения включающие эти поля.
Пример группировки
записей
Группировка по полю данных
SELECT Улица, COUNT(*) FROM Здания GROUP BY Улица
Выводит список улиц и для каждой улицы количества записей.
Группировка по номеру столбца
SELECT FLOOR(Area/10)*10, SUM(Area) FROM Здания GROUP BY 1
Группирует записи по площади домов (с шагом 10, в первой группе с 0 до 10, во второй с
10 до 20 и т.д.) и выводит список групп площадей суммарную площадь для каждой группы.
Группировка по нескольким полям
SELECT COUNT(*) FROM Здания GROUP BY Квартал, Улица
Группирует записи по кварталам, а в кварталах по улицам и выводит количество записей для
каждой подгруппы.
Расширения GROUP BY
Время прочтения: 3 мин.
Для начала вспомним что такое GROUP BY
. Итак, GROUP BY
– конструкция, которая используется в SQL для группировки данных по полю при использовании в запросе функций агрегации (например, SUM, MAX, MIN
и д.р.) либо для исключения дублирования строк (как эквивалент ключевого слова DISTINCT
).
Теперь же рассмотрим расширения GROUP BY
, которые позволяют получать промежуточные итоги и итоги в целом — ROLLUP, CUBE
и GROUPING SETS.
Создадим тестовую таблицу и заполним ее данными.
CREATE TABLE #tmp
(
[eployee] nvarchar(10), --сотрудник
[department] nvarchar(10), --подразделение
[work_year] int, --год
[annual_income] money –доход
)
Начнем с ROLLUP
, который вернет нам общую суммирующую строку. Например, мы хотим посмотреть сколько сотрудников в каждом подразделении и их доход за все время работы. Для этого напишем простой запрос:
SELECT
[department]
,COUNT(DISTINCT [eployee]) as employess_count
,SUM([annual_income]) as common_income
FROM #tmp
GROUP BY [department]
А если нам необходимы общее количество сотрудников и их совокупный доход? Тут на помощь и придет ROLLUP
.
SELECT
[department]
,COUNT(DISTINCT [eployee]) as employess_count
,SUM([annual_income]) as common_income
FROM #tmp
GROUP BY ROLLUP([department])
Также ROLLUP
нам пригодится, если мы хотим увидеть промежуточный итог с доходом каждого сотрудника за все время работы.
SELECT
[eployee]
,[work_year]
,SUM([annual_income]) as common_income
FROM #tmp
GROUP BY ROLLUP([eployee],[work_year])
Строки, отмеченные красными стрелками, будут промежуточным итогом по сотруднику за все его время работы, а фиолетовыми – общая суммирующая строка.
Следующий на очереди — CUBE
. Он похож на ROLLUP
по двум столбцам из предыдущего примера за тем исключением, что CUBE
добавляет суммирующие строки для каждой комбинации групп.
SELECT
[eployee]
,[work_year]
,SUM([annual_income]) as common_income
FROM #tmp
GROUP BY CUBE([eployee],[work_year])
В нашем случае красными стрелками показаны итоги по каждому году для всех сотрудников, которые работали в этом году, синими – общие итоги по каждому сотруднику за все время работы, а фиолетовыми – общая суммирующая строка, как при использовании ROLLUP
.
Но что делать, если мы хотим видеть только суммирующие строки для групп? Ответ на этот вопрос – использовать GROUPING SETS
. Он, как и ROLLUP
и CUBE
, добавляет суммирующую строку для групп, но при этом не включает сами группы.
SELECT
[eployee]
,[work_year]
,SUM([annual_income]) as common_income
FROM #tmp
GROUP BY GROUPING SETS([eployee],[work_year])
То есть на примере видим результат выполнения CUBE
, из которого исключены промежуточные итоги и общий суммирующий итог.
Описанные расширения конструкции GROUP BY
позволяют легко сформировать необходимые итоги, не прибегая к использованию подзапросов и облегчая код.
SQL оператор GROUP BY — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном материале вы узнаете, как использовать SQL оператор GROUP BY с синтаксисом и примерами.
Описание
SQL оператор GROUP BY можно использовать в операторе SELECT для сбора данных по нескольким записям и группировки результатов по одному или нескольким столбцам.
Синтаксис
Синтаксис оператора GROUP BY в SQL:
SELECT expression1, expression2, … expression_n,
aggregate_function (aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n
[ORDER BY expression [ ASC | DESC ]];
Параметры или аргументы
- expression1, expression2, … expression_n
- Выражения, которые не инкапсулированы в агрегатную функцию и должны быть включены в GROUP BY в конце SQL-запроса.
- aggregate_function
- Это агрегатная функция, такая как SUM, COUNT, MIN, MAX или AVG.
- aggregate_expression
- Это столбец или выражение, для которого будет использоваться aggregate_function.
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица.
- WHERE conditions
- Необязательный. Это условия, которые должны быть выполнены для выбора записей.
- ORDER BY expression
- Необязательный. Выражение, используемое для сортировки записей в наборе результатов. Если указано более одного выражения, значения должны быть разделены запятыми.
- ASC
- Необязательный. ASC сортирует результирующий набор в порядке возрастания по expression. Это поведение по умолчанию, если модификатор не указан.
- DESC
- Необязательный. DESC сортирует результирующий набор в порядке убывания по expression.
Пример — использование GROUP BY с функцией SUM
Давайте посмотрим, как использовать GROUP BY с функцией SUM в SQL.
В этом примере у нас есть таблица employees со следующими данными:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id,
SUM(salary) AS total_salaries
FROM employees
GROUP BY dept_id;
SELECT dept_id, SUM(salary) AS total_salaries FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы получите:
dept_id | total_salaries |
---|---|
500 | 119500 |
501 | 113000 |
В этом примере мы использовали функцию SUM, чтобы сложить все зарплаты для каждого dept_id, и мы результатам SUM(salary) указали псевдоним «total_salaries». Поскольку dept_id не инкапсулирован в функцию SUM, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией COUNT
Давайте посмотрим, как использовать предложение GROUP BY с функцией COUNT в SQL.
В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Введите следующий SQL оператор:
SELECT category_id,
COUNT(*) AS total_products
FROM products
WHERE category_id IS NOT NULL
GROUP BY category_id
ORDER BY category_id;
SELECT category_id, COUNT(*) AS total_products FROM products WHERE category_id IS NOT NULL GROUP BY category_id ORDER BY category_id; |
Будет выбрано 3 записи. Вот результаты, которые вы должны получить:
category_id | total_products |
---|---|
25 | 1 |
50 | 4 |
75 | 1 |
В этом примере мы использовали функцию COUNT для вычисления количества total_products для каждого category_id, и мы указали псевдоним «total_products» как результаты функции COUNT. Мы исключили все значения category_id, которые имеют значение NULL, отфильтровав их в предложении WHERE. Поскольку category_id не инкапсулирован в функции COUNT, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией MIN
Давайте теперь посмотрим, как использовать предложение GROUP BY с функцией MIN в SQL.
В этом примере мы снова будем использовать таблицу employees со следующими данными:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id,
MIN(salary) AS lowest_salary
FROM employees
GROUP BY dept_id;
SELECT dept_id, MIN(salary) AS lowest_salary FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы получите:
dept_id | lowest_salary |
---|---|
500 | 57500 |
501 | 42000 |
В этом примере мы использовали функцию MIN, чтобы вернуть самое минимальное значение salary для каждого dept_id, и мы присвоили результатам функции MIN псевдоним «lowest_salary». Поскольку dept_id не инкапсулирован в функцию MIN, он должен быть указан в предложении GROUP BY.
Пример — использование GROUP BY с функцией MAX
Наконец, давайте посмотрим, как использовать предложение GROUP BY с функцией MAX.
Давайте снова воспользуемся таблицей employees, но на этот раз найдем самую максимальную зарплату для каждого dept_id:
employee_number | first_name | last_name | salary | dept_id |
---|---|---|---|---|
1001 | Justin | Bieber | 62000 | 500 |
1002 | Selena | Gomez | 57500 | 500 |
1003 | Mila | Kunis | 71000 | 501 |
1004 | Tom | Cruise | 42000 | 501 |
Введите следующий SQL оператор:
SELECT dept_id,
MAX(salary) AS highest_salary
FROM employees
GROUP BY dept_id;
SELECT dept_id, MAX(salary) AS highest_salary FROM employees GROUP BY dept_id; |
Будет выбрано 2 записи. Вот результаты, которые вы должны получить:
dept_id | highest_salary |
---|---|
500 | 62000 |
501 | 71000 |
В этом примере мы использовали функцию MAX, чтобы вернуть самое максимальное значение salary для каждого dept_id, и мы присвоили псевдоним «highest_salary» результату функции MAX. Столбец dept_id должен быть указан в предложении GROUP BY, поскольку он не инкапсулирован в функции MAX.
Как группировать по двум полям в кристаллических отчетах
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира
.
java — ElasticSearch — группировка по двум разным полям
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
MongoDB Группировка по нескольким полям с использованием функции агрегирования
Введение
В этой статье я познакомлю вас с группой Mongodb по нескольким полям. Чтобы лучше понять, сначала мы узнаем о функции агрегирования.
Функция агрегирования MongoDB
Функции агрегирования используются в предложениях GROUP BY для агрегирования сгруппированных данных. Агрегатные функции работают лучше при использовании с предложением GROUP BY. Однако использование агрегатной функции не ограничивается сгруппированными запросами.
Когда агрегатная функция используется в запросе без предложения GROUP BY, агрегатная функция агрегирует весь набор результатов (все строки, соответствующие предложению WHERE). Если вы не используете предложение GROUP BY, некоторые агрегатные функции в списке SELECT могут использоваться только с другими агрегатными функциями. Вот почему агрегатная функция должна использовать предложение GROUP BY для подключения к списку в списке SELECT.
Например, вместо использования предложения GROUP BY, AVG в списке SELECT может соответствовать только SUM, но не может соответствовать определенному столбцу.
Операция агрегирования MongoDB используется для пакетных операций с данными. После того, как коллекция сгруппирована по условию, выполняется ряд операций, таких как сумма, среднее и другие. Операции агрегирования могут выполнять сложные операции сбора, особенно для математической статистики и интеллектуального анализа данных.
Входными данными операции агрегирования в MongoDB является документ коллекции. На выходе может быть один или несколько документов. MongoDB предлагает очень мощную операцию агрегирования, которую можно разделить на три категории:
- Трубопровод агрегации
- Операция агрегирования для одноразового использования
- Модель программирования MapReduce
Группа Mongodb по нескольким полям
Оператор $ group — это агрегатор, который возвращает новый документ.У него есть свой оператор, мы можем получить поле текущего документа по символу $ + имени поля.
Чтобы сначала понять группу MongoDB по нескольким полям, давайте взглянем на список всех операторов, которые можно использовать в $ group:
- $ sum — возвращает сумму всех числовых полей.
- $ avg — вычисляет среднее значение между числовыми полями.
- $ min — возвращает минимальное значение из числового поля
- $ max — получить максимальное значение из числового поля.
- $ push — вставляет значение поля в поле результата
- $ addToSet — Вставляет значение в массив итогового документа, но не создает дубликатов.
- $ первый — получает только первый документ из сгруппированных, обычно для сортировки.
- $ last — возвращает последний документ.
Трубопровод агрегации
В многопоточном режиме POSIX существует метод, называемый конвейером, поток элементов данных которого выполняется последовательно набором потоков в указанном порядке.Конвейер агрегации состоит из этапа. После обработки документа на одном этапе конвейер агрегации передает результат обработки на следующий этап.
Функция полимерной трубки
Отфильтруйте документ, чтобы узнать, какие документы соответствуют критериям.
Преобразуйте документ и измените форму вывода документа.
Каждый уровень конвейера агрегации определяется с помощью операторов этапа, и каждый оператор этапа может использовать операторы выражения для вычисления суммы, среднего, конкатенации или разрывов строк перед каждым уровнем.Результат возвращается в конце, и возвращенный результат можно напрямую вывести или сохранить в коллекции.
Процесс обработки
- Db.collection.aggregate () может использовать несколько каналов одновременно для обработки данных.
- Db.collection.aggregate () использует собственные операции MongoDB для эффективного агрегирования и поддержки таких операций, как GroupBy в SQL, без необходимости написания пользовательских подпрограмм JS.
- Каждая фаза конвейера ограничивает 100 МБ памяти.Если одноузловой конвейер превышает ограничение, MongoDB генерирует ошибку. Чтобы обрабатывать большие объемы данных, установите для свойства allowDiskUse значение true, чтобы записывать данные во временный файл для агрегированного узла конвейера и разрешить ограничение памяти в 100 МБ.
- Db.collection.aggregate () может применяться к серии срезов, но результат не может быть потерян в серии срезов. MapReduce можно применить к серии фрагментов, и результат может быть потерян в серии фрагментов.
- Db.collection.aggregate () возвращает курсор, данные хранятся в памяти и ими можно управлять напрямую как MongoShell.
- Вывод db.collection.aggregate () может быть сохранен только в одном документе, а размер документа BSON ограничен 16 МБ.
Метод группировки
Использование группового метода аналогично использованию предложения GROUP BY в SQL. Групповой метод имеет три параметра:
- Ключ: отображает ключ группы
- Начальный: инициализирует поле документа, представляющее группу документов
- Уменьшить: функция, возвращающая количество элементов.Эта функция использует в качестве аргументов два параметра: текущий элемент и документ совокупного результата для текущей группы.
- Keyf: необязательный параметр. Используйте функцию, отличную от ключевого аргумента, для представления возвращаемого ключевого объекта.
- Cond: необязательный параметр. Указывает, что условие должно возвращать истину, иначе документ не будет участвовать в группировке. Если этот параметр не указан, все документы участвуют в группировке.
- Завершить: необязательный параметр.Это представляет функцию, которая запускается перед возвратом сгруппированного результата.
Например:
`
js
> db.users.group ({key: {name: true}, начальное: {total: 0},
уменьшить: функция (curr, res) {res.total + = 1}})
`
Давайте посмотрим на выражение. Параметр key указывает, что группа будет сгруппирована по имени: key: {name: true}
Значение начального параметра инициализирует поля, представляющие результирующий документ для группы.В этом случае устанавливается начальное значение итогового поля. В этом поле указано количество элементов в группе. Поскольку элементов может не быть, мы инициализируем нулевое значение.
Параметр reduce представляет функцию, в которой параметр curr указывает на текущий объект в группе, а параметр res представляет текущую группу. Если вы найдете другой объект с определенным значением для поля имени, добавьте этот документ в группу и увеличьте общее значение в документе res на 1.
Использование группы $
$ group использует _id для указания имени ключа для группировки с использованием статистики настраиваемого поля.Использование агрегатной операции проясняет концепцию группы Mongodb по нескольким полям.
1 | db.users.совокупный ({ $ match: {age: {$ gte: 18}} }, { $ group: {_id: $ username, count: {$ sum: 1}} }); // Группа Mongodb по нескольким полям // $ sum: val Добавить значение в каждый документ дб.users.aggregate ({ db.users.aggregate ({ // $ first: val Стать первым в группе |
Группа Mongodb по нескольким полям с использованием операции агрегирования
Сначала выбирается ключ, на котором основано группирование, а затем коллекция делится на группы в соответствии с выбранным значением ключа. Затем вы можете создать окончательный документ, объединив документы в каждой группе.
Группа не поддерживает фрагментированные кластеры и не может выполнять кластеризацию сегментов.Если вам нужна распределенная поддержка, вы должны использовать aggregate или mapReduce.
1 | db.collection.group (документ) |
Подсчитайте количество элементов в каждом столбце
1 | ВЫБРАТЬ СЧЕТ (*) ИЗ товаров GROUP BY category_id; |
Заключение
Эта статья написана для разработчиков, чтобы понять группу Mongodb по нескольким полям с использованием агрегатной функции. Если вы найдете эту статью полезной, продолжайте посещать Object Rocket для получения дополнительных статей, связанных с базами данных.
Если вам нужен совет или помощь в управлении безопасностью, масштабируемостью или резервным копированием базы данных, не стесняйтесь обращаться к нам в Object Rocket.
.
oracle — SQL: как найти дубликаты на основе двух полей?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.