2016-10-28 2 views
0

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

(student_id ,,,,, topic_of_interests)

Теперь тема интересов может варьироваться от походов, чтения и сна. Мне нужно сгруппировать учащихся на основе этой темы интересов, каждый учащийся имеет несколько разделенных запятыми записей в topic_of_interests. Как мне это сделать?

Конечный результат Мне нужно сопоставление, так что запрос одной интересующей темы дает мне всех студентов, связанных с ней. Редактировать: данные довольно большие, и я не знаю значений различной темы интересов.

+1

«* каждый студент имеет несколько разделенных запятыми записей в topic_of_interests *» - не очень хорошая идея. Вы должны ознакомиться с нормализацией базы данных. –

ответ

1

Это классическое отношение «многие ко многим». Вам понадобятся две основные таблицы students, topics и так называемые таблицы мост (или отображения):

create table students_topics (
    student_id int references students, 
    topic_id int references topics, 
    primary key (student_id, topic_id) 
); 

См full example in rextester.


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

С вашей фактической структурой данных попробовать этот подход:

select topic, array_agg(student_id) 
from (
    select student_id, trim(topic) topic 
    from students, 
    unnest(string_to_array(topic_of_interests, ',')) topic 
    ) s 
group by 1; 
+0

Отредактирована часть о том, что вы не знаете набор значений темы интересов из первых рук и ее большой набор данных. – ashfaq

+0

Прочтите обновленный ответ. Вы действительно должны нормализовать свои данные **, особенно **, когда таблица большая. – klin

Смежные вопросы