如何在 sql 中通过单个查询获取项目计数和总计数?
How to get item count along with total count with a single query in sql?
我有一个 table 可以存储有关一家甜品店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等
我需要从 table 获取此信息。
Which item was sold the most per location along with total items sold in those locations.
下面是table
的结构
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, item_count, total_count
FROM cte
WHERE rn = 1;
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
return 具有相同键的一组行的第一行,其中“第一”由 ORDER BY
子句定义。
我有一个 table 可以存储有关一家甜品店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等
我需要从 table 获取此信息。
Which item was sold the most per location along with total items sold in those locations.
下面是table
的结构 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, item_count, total_count
FROM cte
WHERE rn = 1;
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
return 具有相同键的一组行的第一行,其中“第一”由 ORDER BY
子句定义。