mysql - 尝试获得每个销售 channel 的前 10 名产品

标签 mysql sql select group-by greatest-n-per-group

我已经找到了一些答案,但这里没有任何帮助。我需要一个查询来查找一个月内每个销售 channel (总共 5 个)的前 10 个产品。我尝试了一个巨大的 union all 查询,但没有得到我需要的结果。 (无论如何,我认为我写的查询不是最好的......)

SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 1 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 2 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 3 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 4 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 5 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU  , b.SalesChannel
ORDER BY pq DESC LIMIT 10

在不查询数据库 5 次的情况下获取结果的最佳方法是什么?

现在我只能获得总体上最好的产品 - 而不是特定于销售 channel 的产品...

最佳答案

试试这个:

SELECT A.SKU, A.ProductName, A.SalesChannel, A.pq
FROM (SELECT A.SKU, A.ProductName, A.SalesChannel, A.pq, 
             IF(@SalesChannel = @SalesChannel:=A.SalesChannel, @RowId:=@RowId + 1, @RowId:=1) AS RowNum
      FROM (SELECT a.SKU, a.ProductName, b.SalesChannel, SUM(a.PurchasedQuantity) as pq
            FROM all_all_orders_items a
            INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
            WHERE b.SalesChannel IN (1, 2, 3, 4, 5) AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
            GROUP BY a.SKU, b.SalesChannel
            ORDER BY b.SalesChannel, pq DESC
          ) AS A, (SELECT @SalesChannel:=0, @RowId:=1) AS B
      ORDER BY A.SalesChannel, A.pq DESC
     ) AS A 
WHERE A.RowNum <= 10
ORDER BY A.SalesChannel, A.RowNum;

关于mysql - 尝试获得每个销售 channel 的前 10 名产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27701370/

相关文章:

php - 如何对 mysql 查询中具有相同时间的行进行分组?

MySQL SELECT查询在哪里查找不在相关表中的记录

mysql - 将数据从实时服务器上的文件加载到 mysql 中

ajax - Grails选择RemoteFunction不起作用?

jQuery,选择更改时的事件

java - 将数据导入 SQLite Android 应用程序数据库

mysql - 逗号分隔搜索

sql - 在 PostgreSQL 中的 SELECT SQL 语句中插入 SQL 语句

c# - 启用 MSI 时连接到 SQL

angular - 为什么我应该在 Angular 订阅中使用 select with pipe?