Выберите все строки, для которых в таблице ассоциаций имеется не менее 30 единиц идентификатора

#python #sql #sqlite

#python #sql #sqlite

Вопрос:

У меня есть таблица ассоциаций, PostToTag, содержащая только 2 столбца, post_id и tag_id. Я хотел бы отфильтровать каждую строку, содержащую tag_id, для которой в таблице PostToTag имеется менее 30 экземпляров этого tag_id.

 SELECT ptt.post_id, ptt.tag_id, COUNT(tag_id) n FROM PostToTag ptt GROUP BY tag_id HAVING n >= 30
  

Приведенный выше код близок к тому, что мне нужно, но я хотел бы получить все идентификаторы тегов_id, как если бы я не использовал GROUP BY . Я привык работать с dplyr в R и иметь возможность разгруппировать после выполнения агрегатных функций. Каков обычный способ «разгруппировать» в SQL?

Ответ №1:

Хммм … используйте оконные функции:

 SELECT ptt.*
FROM (SELECT ptt.*,
             COUNT(*) OVER (PARTITION BY ptt.tag_id) as cnt
      FROM PostToTag ptt 
     ) ptt
WHERE cnt >= 30;