0

これは、私が以前に尋ねた質問を参照しており、非常に迅速な回答を得ました ( SQL クエリで一緒に最大数を計算する)。問題セットは似ていますが、前の質問の解決策では、ループ内でデータベースにアクセスする必要があり、パフォーマンスの問題が発生します。だから私が今持っているものは、いくつかの結合の後です:

    id | description
     0 | bla
     0 | blub
     0 | bla
     1 | blablub
     1 | bla
   ... | ...

ご覧のとおり、ID はもはや主キーではありません。私が欲しいのは、結果セット内の各 ID について最も使用されている説明を取得することです。次のようになります。

 id | most_popular_description | times_the_desc_appeared_for_an_id
  0 |                      bla |                                 2
  1 |                  blablub |                                 1
... |                      ... |                               ...
4

3 に答える 3

1

最も人気のあるアイテムだけが必要な場合は、これで探している結果セットが得られると思います。これを行う方法は他にもありますが、stats_modeは、グループ内で「最も一般的な」値(つまり、モード)を取得する最も簡単な方法です。

SELECT t.id,
       t.description AS most_popular_description,
       COUNT(*) AS times_the_desc_appeared_for_an_id
FROM mytable t INNER JOIN (
  SELECT id, stats_mode(description) AS desc FROM mytable GROUP BY id
) a ON t.id = a.id AND t.description = a.desc
GROUP BY t.id, t.description;

カウントも必要なので、ネストされたクエリ(インラインビュー)が必要であることに注意してください。

于 2009-04-27T06:42:51.973 に答える
1

これでうまくいくはずです。

select id, description, COUNT(description)
from mytable
group by id, description
order by 3 desc
于 2009-04-27T05:58:50.393 に答える
0

Dense_rank() 分析関数を使用して、各グループ セットの上位 N を取得できると思います。

このようなもの:

select id, description, times_the_desc_appeared_for_an_id
from
(
  select id, description, count(description) times_the_desc_appeared_for_an_id
  dense_rank() over (partition by id, description order by count(description) desc) position
  from mytable
  group by id, description
)
where
  position <= 3
order by id, times_the_desc_appeared_for_an_id;
于 2009-05-03T15:44:57.703 に答える