Хобрук: Ваш путь к мастерству в программировании

Как объединить DISTINCT и COUNT агрегированные значения

У меня есть таблица с темами со столбцами Capture_group_id, subject_id, round_id и некоторыми другими столбцами. Я хочу написать оператор SELECT, который возвращает отдельные субъекты, не обращая внимания на round_id, но я также хочу знать, в скольких раундах участвовал субъект.

Я пришел к этим двум решениям (которые не возвращают результат в нужной форме)

ПЕРВЫЙ:

SELECT study_case.capture_group_id, proband.subject_id,Count(1) AS Count
FROM study_case
JOIN proband
ON study_case.proband_id = proband.proband_id
GROUP BY study_case.capture_group_id, proband.subject_id

это возвращает отдельные предметы с количеством участвующих раундов. Но я не могу добавить столбцы в оператор select, которые не включены в оператор group by.

Другой подход заключался в следующем:

SELECT DISTINCT ON (study_case.capture_group_id, proband.subject_id) study_case.capture_group_id, proband.subject_id, study_case.round_id, proband.gender, proband.birth_year, proband.birth_country

FROM study_case
JOIN proband
ON study_case.proband_id = proband.proband_id
ORDER BY study_case.capture_group_id, proband.subject_id, study_case.round_id

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

13.06.2014

  • Что такое round_id и почему вы не можете (не можете) добавить его в предложение group by? 13.06.2014
  • @brummfondel данные взяты из продольного исследования, запланированного с 3 посещениями на каждого субъекта. Мне не нужно круглое число, но я хочу знать, сколько раз участвовал субъект (для каждого отдельного субъекта). Ответ Гордона Линоффа предоставляет функциональность, которую я искал. 13.06.2014

Ответы:


1

Вы можете делать что хотите с оконными функциями:

SELECT capture_group_id, subject_id, round_id, gender, birth_year, birth_country, cnt
FROM (SELECT sc.capture_group_id, p.subject_id, sc.round_id, p.gender,
             p.birth_year, p.birth_country,
             row_number() over (partition by study_case.capture_group_id, p.subject_id
                                order by sc.capture_group_id, p.subject_id, sc.round_id
                               ) as seqnum,
             count(*) over (partition by sc.capture_group_id, p.subject_id) as cnt
      FROM study_case sc JOIN
           proband p
           ON sc.proband_id = p.proband_id
     ) t
WHERE seqnum = 1
ORDER BY capture_group_id, subject_id, round_id
13.06.2014
  • большое спасибо! Я не понимаю этот запрос в деталях (пока), но он делает именно то, что я хотел сделать. единственное, что я изменил, это исправить 2 синтаксические ошибки (убрал точку с запятой после seqnum = 1, и мне пришлось дать подвыборке псевдоним 13.06.2014
  • Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..