首页 > 解决方案 > 在 SQL 中计算组合的重复次数

问题描述

我有一个物品清单(例如衬衫、上衣、裤子、阿迪达斯、耐克、彪马、口红、洗面奶等),我将它们分类为(衬衫、上衣、裤子 = 衣服、耐克、阿迪达斯、彪马 ​​= 鞋子、口红等=化妆)和像这样的格式的年份 2017-01-01。我想知道在同一日期有多少次购买两种类型的商品,例如,如果我在 2018-02-01 购买了化妆品和衣服,那么我想将“化妆品 + 衣服”这一类别计为 1,如果我在 2017 年 9 月 6 日购买了鞋子和化妆品,那么我想将其计为“鞋子 + 化妆品”类别的 1

我怎样才能做到这一点?

我有下表称为项目:

Year | Purchases | 
------------------
2017-02-01 | makeup
2018-10-01 | shoes
2019-03-01 | makeup
2017-11-01 | shoes
2017-02-01 | clothing
2016-01-01 | shoes
2018-10-01 | clothing
2017-11-01 | clothing
2019-01-01 | makeup
2016-01-01 | makeup

所需的输出是这样的:

Year | Purchases        | Count
-----------------------
2016 | Shoes + makeup   |  1
2017 | Makeup +clothing |  1
2017 | shoes + Clothing |  2
2018 | Shoes + clothing |  1
...

标签: sqlgroup-bycountaggregate-functions

解决方案


这是使用自联接和聚合的一种方法:

select extract(year from t1.date) yr, t1.purchases purchases_1, t2.purchases purchases_2, count(*) cnt
from mytable t1
inner join mytable t2 on t2.date = t1.date and t2.purchases < t1.purchases
group by extract(year from t1.date), t1.purchases, t2.purchases

对于每年,这会计算两种产品在同一日期出现的次数。

笔记:

  • 应该调用存储日期的列是违反直觉的yeardate我在查询中将其重命名为

  • 你没有告诉你正在运行哪个数据库;这使用标准函数extract()来获取每个日期的年份 - 并非所有数据库都支持此函数,但它们都有替代方法

  • 查询将项目放在两个单独的列中 - 您可以将它们连接到您喜欢的同一列中


推荐阅读