所以这是我的查询
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分组
由于
答案 0 :(得分:1)
除了使您现有的查询更具可读性之外,您唯一需要更改的是最外层的order by子句,只是在search_parameters上,然后是num descending。聚合已经从您的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”之前。擅长这个级别。现在,无论经销商是谁,您都希望按照每个不同经销商的“num”数进行排序。
“A”接下来是3个经销商,没有混淆。
然后下至2个搜索参数为“D”和“G”的经销商......遵循类似的层次结构,我们已经知道的4是最后一组,然后是“D”和“G”的alpha,最后在每个“D”和“G”中,最高的“num”。
这会更好地说明您要完成的工作吗?
答案 1 :(得分:0)
你可以这样做将整个查询包装为tabel
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