微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用sql中的单个查询获取项目计数和总计数?

如何解决如何使用sql中的单个查询获取项目计数和总计数?

我有一张表格,其中存储了一家糖果店在所有地点销售的商品的信息。它出售糕点、华夫饼、冰淇淋、糖果等。

我需要从表格中获取这些信息。

每个地点的哪件商品的销量以及在这些地点售出的商品总数最多。

下面是表格的结构

     Column     |            Type             | Modifiers 
----------------+-----------------------------+-----------
 id             | integer                     | 
 date           | timestamp without time zone | 
 item           | character varying(15)       | 
 location       | character varying(25)       | 

现在我把它分解成两个单独的问题

  1. 哪个商品在每个地点的销量最高
  2. 每个地点销售的商品总数。

这些是我的疑问:

查询 #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 举报,一经查实,本站将立刻删除。