2016-10-06 116 views
1

对不起,如果这是一个基本的问题。SQL计数查询

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

store-ProdCode-result 
13p  I10x 5 
13p  I20x 7 
13p  I30x 8 
14a  K38z 23 
17a  K38z 23 

我的数据集有近10万条记录。

我想要做的是,为每个商店找到前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次,直到下一个商店代码)

+1

预期输出应该是? –

+0

我的直觉告诉我建议查看PIVOT函数(取决于您使用的SQL的版本),但如上所述,预期的输出会很有用。 –

+0

@juergend我编辑了我的文章与预期的结果 – timz

回答

0

这是窗口函数的一个好例子。

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 

最内层的查询获取商店中每个产品的计数。第二个内部更多查询根据该计数确定每个商店的这些产品的排名。然后,最外面的查询限制基于该等级的结果。 o

+0

我用我的表名替换t1和t2吗? @JNevill – timz

+0

我跑了,并得到了错误:错误:语法错误在或附近“表” – timz

+0

'表'需要用您的表名替换。 't1'和't2'只是别名(这些子查询的名称),你可以将它们改为任何你喜欢的。 – JNevill

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个以上的记录。由于限制规则仅仅是“包含记录,只要结果值少于10条记录,我的结果值就会小于”

看起来就像你的情况,“结果”是排名,所以它们不会被每个商店重复。

+0

我收到以下错误:错误:列b.result不存在 – timz

+0

我没有确切的列名称为您的表。该表是否称为top10_secondary,并且它是否有名为“result”的列?如果它与r_code不同,那么您将需要重命名这两行中使用“result”的地方。 – efreed

+0

该表称为top10_secondary ..结果字段来自计数结果(prod_code)作为结果.. 也得到错误:模式“b”不存在 – timz