SQL选择每个商店中最受欢迎的商品

时间:2018-01-07 02:56:30

标签: sql greatest-n-per-group

更新3

花了几个小时读SQL,得到了这个:

SELECT 
  StoreID, 
  Products
FROM (
  SELECT
    StoreID,
    ROW_NUMBER() OVER(PARTITION BY StoreID ORDER BY Frequency DESC) AS Ordering,
    Products,
    Frequency
    FROM (
      SELECT
        StoreID,
        Products,
        COUNT(Products) AS Frequency
      FROM 
        StoreRecords
      WHERE 
        StoreGroupID =  1122
      GROUP BY 1,2
      ORDER BY StoreID, Frequency
    ) AS Output
)
WHERE 
  Ordering = 1 

更新2

为不良背景道歉。进一步澄清:

  • 我有一张桌子跟踪我在每个商店出售的产品,在某一天
  • 它有2列:商店ID和产品名称
  • 我想写一个返回每个商店ID的查询,以及销售量最高的产品
  • 这意味着当iPhone在商店A的销售量最高时,该行将返回商店A,iPhone

更新1

例如,这是我表格中的数据。

商店A: Apple iPhone, Apple iPhone, Android手机

商店B: Apple iPhone, Android手机, Android手机

每家商店有3条记录。 我希望我的输出是:

  1. 商店名称
  2. 产品名称
  3. 每家商店销售的最受欢迎商品总数
  4. 例如:

    商店A,Apple iPhone,2 商店B,Android手机,2

    原帖

    我的表中有2列: 1)商店ID和 2)项目名称

    我想写一个返回的查询: 1)商店ID 2)项目名称 3)总数没有。每个商店最受欢迎的商品

    我见过几种方法: 1)过度分区 2)内部加入

    但不确定哪种方法可以推进。

    任何帮助表示感谢。

    样本数据:

    StoreID产品 1 Apple iPhone 1个Android手机 1个Android手机 1 Apple iPhone 1 Apple充电器 2 Android手机 2 Apple iPhone 2 Apple充电器 2 Android手机 3 Apple iPhone 3 Apple充电器 3 Android手机 3 Apple iPhone

    期望的输出:

    商店ID产品 1 Apple iPhone 2 Android手机 3 Apple iPhone

2 个答案:

答案 0 :(得分:1)

设置:

create table sales
(
    id       integer,
    store    varchar(8),
    product  varchar(16)
);

insert into sales (id, store, product) values (1, 'Store A', 'Apple iPhone');
insert into sales (id, store, product) values (2, 'Store A', 'Apple iPhone');
insert into sales (id, store, product) values (3, 'Store A', 'Android Phone');
insert into sales (id, store, product) values (4, 'Store B', 'Apple iPhone');
insert into sales (id, store, product) values (5, 'Store B', 'Android Phone');
insert into sales (id, store, product) values (6, 'Store B', 'Android Phone');

查询:

select
    z.store,
    z.product,
    z.volume
from
    (
        select
            store,
            max(volume) as top_volume
        from
            (
                select 
                    store,
                    product,
                    count(*) as volume
                from
                    sales
                group by
                    store,
                    product
            ) x
        group by
            store
    ) y
    join
        (
            select 
                store,
                product,
                count(*) as volume
            from
                sales
            group by
                store,
                product
        ) z
    on  
        y.store = z.store and
        y.top_volume = z.volume;

结果:

  store  |    product    | volume 
---------+---------------+--------
 Store A | Apple iPhone  |      2
 Store B | Android Phone |      2
(2 rows)

如果排名第一,那么此查询将返回两个产品。

我使用了PostgreSQL,但这可以在任何领先的数据库中使用。请随时询问您是否了解这里发生了什么。

答案 1 :(得分:1)

对于我的回复延迟感到抱歉。

此方法适用于您在商店中共享受欢迎程度的2个项目的情况:

dir

由于您正在学习SQL,因此请注意,您可以在内部查询中引用外部表(在本例中为“s”),该查询获取每个商店的相同项目的最大数量。

花一些时间阅读它,如果您需要进一步澄清,请告诉我。

PS:@Ron Ballard对测试架构的肯定!