对不起,如果这是一个基本问题。
基本上,我有一个如下表,下面是一个基本样本
store-ProdCode-result
13p I10x 5
13p I20x 7
13p I30x 8
14a K38z 23
17a K38z 23
我的数据集有近100,000条记录。
我想要做的是,每家商店都会找到前10名的prodCode。
我不确定如何做到这一点,但我尝试的是:
select s_code as store, prod_code,count (prod_code)
from top10_secondary
where prod_code is not null
group by store,prod_code
order by count(prod_code) desc limit 10
这给了我一些完全不同的东西,我不确定如何实现我的最终结果。
感谢所有帮助。
由于
预期输出应为:每个商店(s_code)显示前10个prodcode
这样:
store--prodcode--result
1a abc 5
1a abd 4
2a dgf 1
2a ldk 6
。(直到下一个商店代码10次)
答案 0 :(得分:0)
这是Window函数的一个很好的例子。
SELECT
s_code,
prod_code,
prod_count
FROM
(
SELECT
s_code,
prod_code,
prod_count,
RANK() OVER (PARTITION BY s_code ORDER BY prod_Count DESC) as prod_rank
FROM
(SELECT s_code as store, prod_code, count(prod_Code) prod_count FROM table GROUP BY s_code, prod_code) t1
) t2
WHERE prod_rank <= 10
最里面的查询获取商店中每个产品的数量。第二个内部更多查询根据该计数确定每个商店的那些产品的等级。然后,最外面的查询根据该排名限制结果。 Ø
答案 1 :(得分:0)
您可以在FROM子句中使用该表两次,一次用于数据,一次用于计算该商店的结果数量较少的记录数。
SELECT a.s_code, a.prod_code, count(*)
FROM top10_secondary a
LEFT OUTER JOIN top10_secondary b
ON a.s_code = b.s_code
AND b.result < a.result
GROUP BY a.s_code, a.prod_code
HAVING count(*) < 10
但是,使用此技术,如果第10个结果值多次存在,则每个商店可能会获得10条以上的记录。因为限制规则只是&#34;包含记录,只要记录的结果值少于10个记录,而且#34;
看起来像你的情况,&#34;结果&#34;是一个排名,所以每个商店不会重复。