我在MySQL工作台8.0上工作,我想找到每个用户ID的每个产品的买家类型的数量.例如,对于椅子,如果USER_ID1、USER_ID2和USER_ID3只购买了一次,我想创建一个列(买家类型)"BoughtOnce"并添加购买的椅子数量;3个椅子(每个用户购买一次).

与原始数据类似的样本数据如下所示.

user_id Product
1 chair
1 bed
2 bed
1 chair
3 bed
2 sofa
3 sofa
3 shelf
2 chair

我希望得到以下结果:

Product BoughtOnce BoughtTwice
chair 1 2
bed 3 Null
sofa 2 Null
shelf 1 Null

例如,user_id 1购买了2把椅子,而user_id 2购买了1把椅子.

我想使用下面的表达式,但意识到我不能聚合窗口函数.

CASE WHEN COUNT(DISTINCT PRODCUT)OVER(PARTITION BY USER_ID)=1则...

有人能帮我这个忙吗?如果你能帮忙,我将不胜感激!

如果你也提出另一种方法,那将是有帮助的.

编辑:我try 了以下方法:

SELECT Product,
       CASE WHEN COUNT(DISTINCT Product) OVER (PARTITION BY user_id)  = 1 THEN COUNT(DISTINCT Product) END AS "BoughtOnce",
       CASE WHEN COUNT(DISTINCT Product) OVER (PARTITION BY user_id)  = 2 THEN COUNT(DISTINCT Product) END AS "BoughtTwice"
From   myData;

推荐答案

使用CTE来获取一个用户ID获取项目的次数,然后计算产品的ROW_NUMBER的出现次数

WITH CTE AS (SELECT 
`Product`, ROw_NUMBER() OVER(PARTITION BY `user_id`, `Product`) rn
FROM table1)
SELECT
  `Product`,
SUM(rn = 1) as once,
SUM(rn = 2) as twice,
SUM(rn = 3) as three,
SUM(rn > 3) as morethanthree
FROM CTE
GROUP BY `Product`
Product once twice three morethanthree
bed 3 0 0 0
chair 2 1 0 0
sofa 2 0 0 0
shelf 1 0 0 0

fiddle

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

在MySQL中查找具有公共值的列名

MySQL全文索引和不区分大小写搜索带来的挑战

MySQL滑动窗口动态间隔?

MySQL 搜索列字段字符串

按唯一列排序,但保持匹配的列在一起

如何使用等于、喜欢和不等于在 json 字段上编写查询?

优化解析 5000 万行 MySQL 表的请求

Mysql JSON_REMOVE 数组键和值 (MariaDB)

将 Go var 传递给 MySQL - try 在 Go lang 程序 (MySQL db) 中执行 db.Exec 时出错

mysql数据库数据文件夹中的DESKTOP-7JFP5MF-bin.000001文件有什么用?

如何使用 sequelize 将复合主键放在连接表中?

提高mysql导入速度

MySQL:在 Select 语句中自动增加临时列

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

MySQL更新查询与左连接和分组依据

BIGINT mysql 性能与 INT 相比

匹配 IN 子句中的所有值

AWS RDS 实例升级停机时间