0

count(*)個別の行がフィルター処理される前に行数が返されるという問題があります。

これは私のクエリの簡略版です。テーブルから他の多くのデータを抽出することに注意してくださいgroup by。おそらく 10 列でグループ化する必要があるため、同じ結果は返されません。それが機能する方法mは、マップ マッピングqcおよびklであるため、 への参照が複数存在する可能性がありますq.id。1つだけ欲しい。

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)、distinct on (q.id) は実際には行数です。

そのため、count 関数はフィルタリングされた行にアクセスできないようです。どうすればこれを解決できますか? アプローチを再考する必要がありますか?

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おそらく必要なものです。

(明示的なJOINを使用するために、暗黙的な結合構文を書き直したことに注意してください)

于 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は、集計関数を使用しないすべての列で group by を実行するための単なる構文糖衣です。

于 2013-02-07T14:33:15.960 に答える