SQL计数查询

时间:2016-10-06 15:15:34

标签: sql postgresql greatest-n-per-group

对不起,如果这是一个基本问题。

基本上,我有一个如下表,下面是一个基本样本

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次)

2 个答案:

答案 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;是一个排名,所以每个商店不会重复。