0

我有一个问题,我count(*)将在过滤不同的行之前返回行数。

这是我的查询的简化版本。请注意,我将从表中提取许多其他数据,因此group by不会返回相同的结果,因为我可能必须按 10 列进行分组。它的工作方式m是映射映射qc因此kl可以有多个对q.id. 我只想要一个。

SELECT distinct on (q.id) count(*) over() as full_count
from q, c, kl, m 
where c.id = m.chapter_id
    and q.id = m.question_id
    and q.active = 1
    and c.class_id = m.class_id
    and kl.id = m.class_id
order by q.id asc

如果我运行它,我会得到full_count = 11210它只返回 9137 行。如果我在没有 的情况下运行它distinct on (q.id),则 (q.id) 上的 distinct 确实是行数。

因此,计数函数似乎无权访问过滤后的行。我该如何解决这个问题?我需要重新考虑我的方法吗?

4

2 回答 2

1

我不完全确定您到底要计算什么,但这可能会让您入门:

select id, 
       full_count,
       id_count
from (
    SELECT q.id, 
           count(*) over() as full_count,
           count(*) over (partition by q.id) as id_count,
           row_number() over (partition by q.id order by q.id) as rn
    from q
      join m on q.id = m.question_id
      join c on c.id = m.chapter_id and c.class_id = m.class_id
      join kl on kl.id = m.class_id
    where q.active = 1
) t
where rn = 1
order by q.id asc

如果您需要每个 id的计数,那么该列id_count就是您需要的。如果您需要总体计数,但仅在每个 id 的行上,那么这full_count可能就是您想要的。

(请注意,我重写了您的隐式连接语法以使用显式连接)

于 2013-02-07T14:40:44.003 回答
0

你可以使用子查询:

select qid, count(*) over () as full_count
from (SELECT distinct q.id
      from q, c, kl, m 
      where c.id = m.chapter_id
            and q.id = m.question_id
            and q.active = 1
            and c.class_id = m.class_id
            and kl.id = m.class_id
     ) t
order by q.id asc

但这group by 正确的方法。distinctin的关键字select实际上只是对所有非聚合功能列进行分组的语法糖。

于 2013-02-07T14:33:15.960 回答