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 添加一个组,但这会产生错误“选择列表表达式不是由聚合输出生成的(缺少 GROUP BY 子句?)”可能还需要注意我正在使用这个在 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”,每个参数都有 4 个经销商,因此即使按字母顺序大于搜索参数“A”(计数3)。现在,在 4 个经销商组中,他们是 alpha,所以“X”在“Y”之前。好在这个水平。现在,无论经销商是谁,您都希望按每个不同经销商的“数量”计数对其进行排序。

“A”接下来是 3 个经销商,那里没有混淆。

然后到搜索参数为“D”和“G”的 2 个经销商......遵循与我们已经知道 2 在最后一组中的 4 类似的层次结构,然后是“D”和“G”的 alpha,最后在每个分别为“D”和“G”,最高的“num”。

这是否更好地阐明了您要完成的工作?

于 2013-06-25T14:44:37.537 回答
0

您可以这样做将整个查询包装为表格

SELECT q.* FROM (
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
  ) q GROUP BY q.search_parameters

这是示例

SELECT q.* FROM (your whole query) q GROUP BY q.any_column_in_query
于 2013-06-25T14:35:07.557 回答