【问题标题】:SQL Query For Most Popular Combination最流行组合的 SQL 查询
【发布时间】:2018-05-18 20:31:08
【问题描述】:

假设我有一个带有购买表的杂货店应用程序:

customerId int
itemId int

四个顾客进店:

Bob buys a banana, lemonade, and a cookie 
Kevin buys a banana, lemonade, and a donut
Sam buys a banana, orange juice, and a cupcake 
Susie buys a banana

我正在尝试编写一个查询,该查询将返回哪些项目组合最受欢迎。在这种情况下,这个查询的结果应该是:

banana and lemonade-2

我已经编写了一个查询,它告诉我多商品购买中的所有商品的列表(我们不包括一件商品的销售 - 它不能形成“组合”)。它返回:

banana - 3
lemonade - 2
cookie - 1
donut - 1
cupcake - 1
orange juice - 1

这里是查询:

SELECT itemId, count( * ) 
FROM grocery_store
INNER JOIN (
SELECT customerId
FROM grocery_store
GROUP BY customerId
HAVING count( itemId ) > 1
)subQuery ON subQuery.customerId = grocery_store.customerId
GROUP BY itemId;

我能否获得有关如何扩展现有查询以获得所需输出的指针?

【问题讨论】:

  • 这是什么 RDBMS?可能有一些专有技巧可以帮助解决这种类型的关系划分问题。
  • 您将销售信息存储在表grocery_store 中?我推断customerID被用作临时客户,所以它真的只是sales_id对吗?

标签: sql


【解决方案1】:
select a.itemID, b.itemID, COUNT(*) countForCombination
from grocery_store a
inner join grocery_store b
on a.customer_id = b.customer_id
and a.itemID < b.itemID
group by a.itemID, b.itemID
order by countForCombination desc

假设:

grocery_store = 销售记录
customer_id   = 唯一销售

  • 此查询获取所有的grocery_store 记录,并且对于每个单一的销售交易,它以特定的顺序(a.itemid)创建所有可能的组合(a.itemid、b.itemid)
  • 此特定顺序消除了重复项(苹果、橙子)被保留,而(橙子、苹果)不是必需的。
  • 从所有销售中生成所有组合后,使用简单的分组和按计数排序以在顶部显示最受欢迎的组合

【讨论】:

  • 实际上 customer_id 标识下订单的人。此示例中没有唯一的 sales_id(用于标识唯一的销售)。每行确实标识了一个唯一的销售,但没有明确的 sales_id 编号。
  • 那么如果客户购买香蕉+苹果3次,是否算作3票?表有NO 唯一键吗?
  • 是的,没有唯一键。仅有的两列是谁购买了它 (customerId) 和他们购买了什么 (itemId)。如果你买一个香蕉和一个苹果,它会创建两行(一个用于香蕉,一个用于苹果)。显然,这意味着同一个客户不能两次购买香蕉(但这在此示例背后的实际业务问题中不是问题)。
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多