如何使用 sql 中的单个查询获取项目计数和总计数?
Posted
技术标签:
【中文标题】如何使用 sql 中的单个查询获取项目计数和总计数?【英文标题】:How to get item count along with total count with a single query in sql? 【发布时间】:2021-04-04 04:46:47 【问题描述】:我有一张表,其中存储有关一家糖果店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等。
我需要从表格中获取这些信息。
每个地点销售最多的商品以及在这些地点销售的商品总数。
下面是表格的结构
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
【问题讨论】:
【参考方案1】:我将按位置和项目聚合,使用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, item_count, total_count
FROM cte
WHERE rn = 1;
【讨论】:
【参考方案2】:Postgres 有一个很好的扩展 DISTINCT ON
,它允许你在没有子查询的情况下做到这一点:
SELECT DISTINCT ON (location) location item,
COUNT(*) AS item_count,
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
子句定义。
【讨论】:
以上是关于如何使用 sql 中的单个查询获取项目计数和总计数?的主要内容,如果未能解决你的问题,请参考以下文章