【问题标题】:SQL counting querySQL计数查询
【发布时间】:2016-10-06 15:15:33
【问题描述】:

抱歉,这是一个基本问题。

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

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

我的数据集有近 100,000 条记录。

我要做的是,为每家商店找到前 10 个产品代码。

我不确定如何执行此操作,但我尝试的是:

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 个产品代码

所以:

store--prodcode--result
1a      abc       5
1a      abd       4 
2a      dgf       1
2a      ldk       6

.(10 次直到下一个商店代码)

【问题讨论】:

  • 预期输出应该是?
  • 我的直觉告诉我建议研究 PIVOT 函数(取决于您使用的 SQL 版本),但如上所述,预期的输出会很有用。
  • @juergend 我已经按照预期结果编辑了我的帖子
  • 如果有什么不明白的地方请告诉我
  • 请不要在收到答案后破坏您的问题。

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


【解决方案1】:

您可以在 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 条记录就包含记录”

在您的情况下,“结果”是一个排名,因此它们不会在每个商店中重复。

【讨论】:

  • 我收到以下错误:错误:b.result 列不存在
  • 我没有您的表格的确切列名。该表是否名为 top10_secondary,是否有一个名为“result”的列?如果它与 r_code 之类的不同,那么您需要重命名这两个地方“结果”用于该行。
  • 该表称为 top10_secondary.. 结果字段来自计数(prod_code)的结果作为结果.. 也得到错误:架构“b”不存在
【解决方案2】:

这是 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

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

【讨论】:

  • 我是否将 t1 和 t2 替换为我的表名? @JNevill
  • 我运行并得到错误:错误:“表”或附近的语法错误
  • table 需要替换为您的表名。 t1t2 只是别名(这些子查询的名称),您可以将它们更改为您喜欢的任何内容。
  • 现在显示错误:列“top10_secondary.s_code”必须出现在 GROUP BY 子句中或用于聚合函数中
  • 是的。我忘记了那部分。我已经相应地更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多