Как найти группы в наборе данных SQL?

У меня есть таблица SQL с двумя такими столбцами и примерно 130 тыс. строк. (9 тысяч уникальных пользователей, 7500 уникальных навыков)

Пользователь Навык А 1 А 2 Б 3 С 1

Я пытаюсь понять (и, возможно, визуализировать) количество пользователей, обладающих одинаковыми наборами навыков. Я не знаю, какие навыки пересекаются сегодня.

Мне нужны результаты группы A {Skills: 1, 2 и 7}, состоящей из 10 человек, Группа B {Skills: 10 и 95} состоит из 19 человек и т. д.

Спасибо за вашу помощь.

Ожидается, что минимально воспроизводимый пример будет включать как данные таблицы образцов, так и ожидаемый результат (соответствующий данным образца). Также покажите нам свою текущую попытку запроса и добавьте тег для используемой базы данных.

jarlh 11.07.2024 19:39

Вы имеете в виду один и тот же набор навыков или пересекающиеся наборы навыков? Если бы у одного пользователя были навыки 1,2,3, а у другого — навыки 2,3,4, то они вообще не совпадали бы или вы бы хотели, чтобы они отображались как соответствующие навыкам 2,3?

NickW 11.07.2024 19:48

какую СУБД вы используете? MySQL, SQL Server, PostgreSQL,..... . отмечайте это правильно

RF1991 11.07.2024 20:10

Ваши выборочные данные слишком скудны для этого вопроса. Пожалуйста, предоставьте больше данных в примере и желаемый результат. Используя ваши данные, установите навыки (1,2)-count=1 (пользователь A). Набор навыков (1) count=1 (пользователь C) или count=2 (userc A,C)? А навыки установлены (2)-count=0 или count=1 (пользователь А)?

ValNik 11.07.2024 20:11
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вам необходимо сгруппировать пользователей по их набору навыков.

предполагая, что вы используете MySQL, это примерно так:

SELECT 
    User,
    group_concat(Skill ORDER BY Skill, ',') AS Skills
FROM 
    your_table
GROUP BY 
    User;

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

WITH UserSkills AS (
    SELECT 
        User,
        group_concat(Skill ORDER BY Skill, ',') AS Skills
    FROM 
        your_table
    GROUP BY 
        User
)
SELECT 
    Skills,
    COUNT(User) AS NumberOfUsers
FROM 
    UserSkills
GROUP BY 
    Skills
ORDER BY 
    NumberOfUsers DESC;

Если вы не используете MySQL, вам необходимо найти соответствующую функцию для group_concat (например, string_agg в PostgreSQL).

Другие вопросы по теме