sql - 在 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
...
解决方案
这是使用自联接和聚合的一种方法:
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
对于每年,这会计算两种产品在同一日期出现的次数。
笔记:
应该调用存储日期的列是违反直觉的
year
;date
我在查询中将其重命名为你没有告诉你正在运行哪个数据库;这使用标准函数
extract()
来获取每个日期的年份 - 并非所有数据库都支持此函数,但它们都有替代方法查询将项目放在两个单独的列中 - 您可以将它们连接到您喜欢的同一列中
推荐阅读
- oracle - 在 oracle 中插入不工作的 plsql
- javascript - 使用Javascript单击按钮时,根据选项选择重定向到页面
- sql-server - MS SQL Server 视图不允许 CONCAT
- jenkins - 使用参数远程调用 Jenkins Job - 将参数放入正文而不是 url 的方法?
- scala - 在火花斯卡拉中枢轴
- c# - System.ValueTuple NuGet 如何扩展我的语言功能?
- python - Python3,子模块问题 - ImportError: cannot import name 'sql'
- java - 如何降低 Java Ant 任务中的日志级别
- c++ - 为什么 {} 作为函数参数不会导致歧义?
- php - 通过关系 Laravel 访问两个表数据