如何组合DISTINCT和COUNT聚合值

时间:2014-06-13 11:21:47

标签: sql postgresql count

我有一个表格,主题包括capture_group_id,subject_id和round_id以及其他一些列。我想写一个SELECT语句,它返回不同的主题,而不考虑round_id,但我也想知道主题参与了多少轮。

我来到这两个解决方案(没有以所需形式返回结果)

FIRST:

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 Statment,计算DISTINCT聚合主题并包括第二个语句中的所有列?

1 个答案:

答案 0 :(得分:2)

您可以使用窗口功能执行所需操作:

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