0

これが私のクエリです

select 
A.search_parameters,
reseller_count,
reseller,
num

from 

(select 
 search_parameters,
 count(distinct(reseller)) as reseller_count 
 from all_lookups 
 group by search_parameters)A

 join

 (select
  search_parameters,
  reseller,
  count(*) as num
  from all_lookups
  group by reseller,search_parameters)B

  on A.search_parameters=B.search_parameters

  where a.search_parameters not like '%addsomekeywords%' 
  and a.search_parameters not like '%add-some%' 
  order by reseller_count DESC,num 
  DESC limit 1000

なぜかreseller_countで結果がまとめられているのですが、search_parametersでまとめてほしいです。where 句の後に A.search_paramters でグループを追加しようとしましたが、これにより「select list expression not generated by aggregate output (missing from GROUP BY clause?)」というエラーが発生します。これを使用していることに注意することも重要です。 Cloudera Impala でクエリを実行しますが、同じ MySQL ルール/構文が引き続き適用されると思われます

ここに私が得ているものの例があります

A.search_parameter|reseller_count|reseller|num
hello             | 2            | abc    |556
hi                | 2            | tre    |54
hello             | 2            | xyz    |9
hi                | 2            | ytu    |4

そして私が欲しいのは

A.search_parameter|reseller_count|reseller|num
hello             | 2            | abc    | 556
hello             | 2            | xyz    | 9
hi                | 2            | tre    | 54
hi                | 2            | ytu    | 4

基本的にreseller_countが同じ「search_parameters」は全てランダムにまとめてあるのですが、search_parameterごとにまとめて欲しいです

ありがとう

4

2 に答える 2

1

既存のクエリをもう少し読みやすくすることは別として、変更する必要があるのは、最も外側の order by 句を search_parameters に配置し、次に num を降順にすることだけです。集計は、JOINED クエリの結果から既に「グループ化」されています。

select 
      A.search_parameters,
      A.reseller_count,
      B.reseller,
      B.num
   from 
      ( select 
              search_parameters,
              count(distinct(reseller)) as reseller_count 
           from 
              all_lookups 
           group by 
              search_parameters ) A
      join
      ( select
              search_parameters,
              reseller,
              count(*) as num
           from 
              all_lookups
           where 
                  search_parameters not like '%addsomekeywords%' 
              and search_parameters not like '%add-some%' 
           group by 
              search_parameters,
              reseller ) B

         on A.search_parameters = B.search_parameters
   order by 
      A.search_parameters,
      B.num DESC 
   limit 
      1000

フィードバック/コメントごと。再販業者の数にも基づいて必要な場合は、以下のように注文を調整してください。

   order by 
      A.reseller_count DESC,
      A.search_parameters,
      B.num DESC 

したがって、これが行うことは、最高の再販業者を持つすべての人がリストの一番上になることです...次に、同じように再販業者の数が多い複数の「search_parameters」がある場合、それらはグループ化され、最終的には各検索パラメータで、番号が最大の再販業者が一番上に表示されます。次のサンプル データ カウントを取得します。

ここでは、サンプルを明確にするために、列名の見出しを変更しました。

DistResell   SearchParm   ActualReseller   NumPerReseller
   4         X            Mary             405
   4         X            Bob              108
   4         X            George           107
   4         X            Jane              98
   4         Y            Jim              290
   4         Y            Jill             287
   4         Y            Mary             243
   4         Y            Sam              164
   3         A            Sam              201
   3         A            Mary             187
   3         A            Joe              146
   2         D            Jim              73
   2         D            Kathy            67
   2         G            Mary             140
   2         G            Jeff             125

したがって、この例でわかるように、「X」と「Y」という 2 つの検索パラメータがあり、それぞれに 4 つの再販業者が存在するため、アルファベット順で検索パラメータ「A」よりも大きい場合でもリストの一番上にプッシュされます (countの 3)。現在、4 つの再販業者のグループ内ではアルファ版であるため、「X」は「Y」の前にあります。このレベルでいい。ここで、再販業者が誰であるかに関係なく、個別の再販業者ごとに「num」カウントでソートする必要があります。

次は「A」で、再販業者が 3 社ありますが、混乱することはありません。

次に、「D」と「G」の検索パラメーターを持つ 2 つの再販業者まで... 4 と同様の階層に従いますが、2 つは最後のグループにあり、次に「D」と「G」によるアルファ、そして最後に内にあることがわかっています。それぞれの「D」と「G」、最大の「num」。

これにより、達成しようとしていることをより明確にすることができますか?

于 2013-06-25T14:44:37.537 に答える