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”