SQLite-从多个列创建虚拟变量向量/字符串
我有一些数据如下所示:SQLite-从多个列创建虚拟变量向量/字符串,sqlite,Sqlite,我有一些数据如下所示: UserID Category ------ -------- 1 a 1 b 2 c 3 b 3 a 3 c A我想按UserID对这个分组进行二进制编码:类别中存在三个不同的值,因此二进制编码类似于: UserID encoding ------ -------- 1 "1, 1, 0" 2 &quo
UserID Category
------ --------
1 a
1 b
2 c
3 b
3 a
3 c
A我想按UserID
对这个分组进行二进制编码:类别中存在三个不同的值,因此二进制编码类似于:
UserID encoding
------ --------
1 "1, 1, 0"
2 "0, 0, 1"
3 "1, 1, 1"
i、 例如,UserID
=3
,所有三个值都存在,因此相应的向量是“1,1,1”
当使用
语句时,有没有一种方法可以在不使用大量CASE的情况下执行此操作?类别中可能有几十个可能的值
首先创建一个编码表以明确确定位图中类别的顺序:
create table e (Category int, Encoding int);
insert into e values ('a', 1), ('b', 2), ('c', 4);
首先生成与编码表e连接的用户列表u
(交叉),以获得完全填充的(UserId、Category、encoding)表。然后用用户提供的数据左键连接完全填充的表t
。如果我们需要设置位或不需要设置位,现在可以使用右侧t
驾驶:
select
u.UserId,
'"' ||
group_concat(case when t.UserId is null then 0 else 1 end, ', ')
|| '"' 'encoding'
from
(select distinct UserID from t) u
join e
left natural join t
group by 1
order by e.Encoding
并给出了预期的结果:
1|"1, 1, 0"
2|"0, 0, 1"
3|"1, 1, 1"
将不同的用户交叉连接到不同的类别,然后左连接到表。
然后使用
GROUP\u CONCAT()
窗口函数,该函数支持ORDER BY
子句,以收集0
s和1
s:
WITH
users AS (SELECT DISTINCT UserID FROM tablename),
categories AS (
SELECT DISTINCT Category, DENSE_RANK() OVER (ORDER BY Category) rn
FROM tablename
),
cte AS (
SELECT u.UserID, c.rn,
'"' || GROUP_CONCAT(t.UserID IS NOT NULL)
OVER (PARTITION BY u.UserID ORDER BY c.rn) || '"' encoding
FROM users u CROSS JOIN categories c
LEFT JOIN tablename t
ON t.UserID = u.UserID AND t.Category = c.Category
)
SELECT DISTINCT userID,
FIRST_VALUE(encoding) OVER (PARTITION BY UserID ORDER BY rn DESC) encoding
FROM cte
ORDER BY userID
这适用于任何数量的类别。请参阅。
结果: 用户ID 编码 1. "1,1,0" 2. "0,0,1" 3. "1,1,1"
这是有道理的,但是我可能在列中有很多可能的值:a,b,c,…zz,因此我需要一种方法来避免手动添加它们。如何指定编码?这是一种二进制编码,因此如果数据中存在值a,b,c,那么向量“a,b,c”可以映射到“1,1,1”,如果给定用户ID的所有值都存在,或者"0, 0, 0“如果不存在任何值,等等。是的,我知道,但是zt的编码是吗?您是否有一个带有编码的表,如果有,值是什么?zt是什么意思?编码在技术上是任意的,如果在数据集中添加或删除其他值,编码可能会更改。我还可以任意指定一个编码,如“B,A,C”