能否用SQL实现按用户产品集合相似度统一打标签?
可以用SQL实现这个需求
核心思路是把每个用户的去重后产品集合转化为一个与顺序无关的唯一标识,再基于这个标识给用户分配相同标签,具体实现步骤如下:
步骤1:生成用户的唯一产品集合标识
先对每个用户的product_id去重,再按固定顺序(比如字母/数字升序)拼接成字符串——这样不管产品原本的顺序或重复情况,相同的产品集合会得到完全一致的字符串。
以PostgreSQL为例,SQL代码如下:
WITH user_product_sets AS ( SELECT user_id, -- 去重后按product_id排序拼接,生成唯一标识 STRING_AGG(DISTINCT product_id, ',' ORDER BY product_id) AS product_set FROM user_products GROUP BY user_id )
其他数据库的函数差异:
- MySQL:用
GROUP_CONCAT(DISTINCT product_id ORDER BY product_id SEPARATOR ',')替代STRING_AGG - SQL Server:同样支持
STRING_AGG,用法和PostgreSQL一致 - Oracle:使用
LISTAGG(DISTINCT product_id, ',' WITHIN GROUP (ORDER BY product_id))
步骤2:基于产品集合标识分配标签
可以用两种方式生成标签:
方式一:生成连续数字标签
用DENSE_RANK()函数给每个唯一的产品集合分配连续的标签ID,直观易读:
SELECT ups.user_id, ups.product_set, DENSE_RANK() OVER (ORDER BY ups.product_set) AS user_tag FROM user_product_sets ups;
方式二:生成哈希值标签
如果不需要连续数字,也可以用哈希函数(比如MD5)把产品集合字符串转成固定长度的哈希值当标签:
SELECT ups.user_id, MD5(ups.product_set) AS user_tag FROM user_product_sets ups;
示例效果
假设原表数据:
| user_id | product_id |
|---|---|
| 1 | A |
| 1 | B |
| 2 | B |
| 2 | A |
| 3 | C |
| 4 | A |
| 4 | B |
| 4 | A |
执行上述SQL后,user_id为1、2、4的用户会得到相同标签,user_id为3的用户得到单独标签,完全符合需求。
内容的提问来源于stack exchange,提问作者chandra sutrisno
相关产品推荐
相关产品推荐

