如何解决如何使用sql中的单个查询获取项目计数和总计数?
我有一张表格,其中存储了一家糖果店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等。
我需要从表格中获取这些信息。
每个地点的哪件商品的销量以及在这些地点售出的商品总数最多。
下面是表格的结构
Column | Type | Modifiers
----------------+-----------------------------+-----------
id | integer |
date | timestamp without time zone |
item | character varying(15) |
location | character varying(25) |
现在我把它分解成两个单独的问题
- 哪个商品在每个地点的销量最高
- 每个地点销售的商品总数。
这些是我的疑问:
查询 #1:
select location,item,count(item) as count_
from sweet_shop
group by location,item;
查询 #2:
select location,count(item) as count_
from sweet_shop
group by location;
如您所见,我进行了两个单独的查询,然后我需要将这两个信息映射到正确的位置并获得最终输出。我正在寻找像下面这样的输出
location | item | item_count total_count
---------------+-------------------+-------------|----------
BA2 | candies | 400 | 550
BA4 | pastries | 320 | 610
BA3 | waffles | 250 | 400
BA7 | ice creams | 180 | 500
但我想在单个查询中获取此信息,而不是进行两个单独的查询。这怎么办?
注意:我使用的是 Postgres 9.2
解决方法
我会按位置和项目进行聚合,使用 COUNT()
作为分析函数来生成每个位置的总数。此外,使用 ROW_NUMBER
确定每个位置中表现最好的项目。
WITH cte AS (
SELECT location,item,COUNT(*) AS item_count,SUM(COUNT(*)) OVER (PARTITION BY location) AS total_count,ROW_NUMBER() OVER (PARTITION BY location
ORDER BY COUNT(*) DESC) rn
FROM sweet_shop
GROUP BY location,item
)
SELECT location,item_count,total_count
FROM cte
WHERE rn = 1;
,
Postgres 有一个非常好的扩展 DISTINCT ON
,它允许您在没有子查询的情况下执行此操作:
SELECT DISTINCT ON (location) location item,SUM(COUNT(*)) OVER (PARTITION BY location) AS total_count
FROM sweet_shop
GROUP BY location,item
ORDER BY location,COUNT(*) DESC;
DISTINCT ON
返回一组具有相同键的行的第一行,其中“first”由 ORDER BY
子句定义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。