1

カウントのMAXを取得する必要がありますが、機能しません.Oracleは深い集計を許可していません..

これは MAX なしの結果です。

187 1   2
187 3   1
159 1   1
159 3   1
159 2   8
188 2   9
188 1   2
188 3   1
187 2   9



select tt.token_id, tt.tag_variable_type_id, max(count(*)) as usage
from tokens tt
left outer join token_xref ttx on ttx.token_id = tt.token_id
where tag_variable_type_id in (1, 2, 3) and ttx.template_id = 52
group by tt.token_id, tt.tag_variable_type_id

また、 max(count(*)); を持つようにしました。しかし、うまくいきませんでした

1 つのクエリで COUNT() の MAX を取得し、内部選択を行わない方法はありますか

MAX以降に期待

187 2 9
159 2 8
188 2 9

編集

重複がある場合に除外する行を推測するのではなく、分析クエリを使用することにもう1つ懸念があります

MIN(tag_variable_type_id) KEEP (DENSE_RANK LAST ORDER BY usage) AS tag_variable_type_id

デコード関数を使用して変数タイプ「Priority」に割り当てたので、私の推測では MIN(priority) KEEP (DENSE_RANK LAST ORDER BY usage) AS priority、クエリを参照してください

しかし、私は再びtag_variable_type_idを失っています..

とにかくそれを維持するには?デコードして戻しますが、もっと良い方法かもしれません

 decode (MIN(priority) KEEP (DENSE_RANK LAST ORDER BY usage), 1,2, 2,1, 3,3) as typevar,



select token_id,    
   MIN(priority) KEEP (DENSE_RANK LAST ORDER BY usage) AS priority,
   MAX(usage) AS usage 
from ( select tt.token_id, tt.tag_variable_type_id,  
              decode(
                tt.tag_variable_type_id,
                1, 2, 
                2, 1, 
                3, 3  
              ) as priority,
              count(*) as usage 
       from tag_tokens tt 
       left outer join template_token_xref ttx on ttx.token_id = tt.token_id 
       where tag_variable_type_id in (1, 2, 3) and ttx.template_id = 52 
       group by tt.token_id, tt.tag_variable_type_id)
group by token_id;
4

4 に答える 4

2

元の結果セットの行を、最大の使用量を取得する同じ結果セットの別のクエリと一致させる必要があります。

WITHわかりやすくするために句を使用します。

WITH result_count as (select tt.token_id, tt.tag_variable_type_id, count(*) as usage
    from tokens tt
       left outer join token_xref ttx on ttx.token_id = tt.token_id
       where tag_variable_type_id in (1, 2, 3) and ttx.template_id = 52
       group by tt.token_id, tt.tag_variable_type_id )
select result_count.token_id, tag_variable_type_id, max_usage
   from result_count   join  -- original result set
     (select token_id, max(usage) max_usage
        from result_count
        group by token_id) result_max on  -- result set with max usage
         result_count.token_id = result_max.token_id AND
         usage = max_usage ;

ここでtag_variable_type_id、最大数に達する行が複数ある場合、1 つの行に対して複数の行が表示されtoken_idます。1 つだけ必要な場合は、任意の条件を追加する必要があります。

于 2013-09-05T08:46:37.723 に答える
0

ROW_NUMBERを使用して、各行に一意の行番号を割り当てることができます。

select token_id,tag_variable_type_id,usage
  from(
       select tt.token_id token_id,
              tt.tag_variable_type_id tag_variable_type_id,
              count(*) as usage,
              row_number() over (partition by tt.token_id order by count(*) desc) as r
         from tokens tt left outer join token_xref ttx
              on ttx.token_id = tt.token_id
        where tag_variable_type_id in (1, 2, 3)
          and ttx.template_id = 52
        group by tt.token_id, tt.tag_variable_type_id
        )
 where r= 1;
  • order by count(*) desc最高のカウントが行番号 1 を取得し、次に高い行番号 2 などを取得するようにします。
  • partition by tt.token_idtoken_id の各グループに対して、この番号付けが確実にリセットされるようにします。

この行番号を外側のクエリで使用して、行番号 1 の行のみをフィルタリングします。

于 2013-09-05T04:31:22.957 に答える