【发布时间】:2021-06-24 02:16:35
【问题描述】:
我有一个包含许多功能标志的用户的事件表
CREATE TABLE features (
user_id bigint
, value text
, feature_1 boolean
, feature_2 boolean
, feature_3 boolean
);
填充这个
INSERT INTO features
VALUES
(1, 'value a', true, false, false)
, (1, 'value b', false, false, true)
, (1, 'value c', false, true, false)
, (2, 'value X', false, true, false);
给我们
select * from features;
user_id | value | feature_1 | feature_2 | feature_3
---------+---------+-----------+-----------+-----------
1 | value a | t | f | f
1 | value b | f | f | t
1 | value c | f | t | f
2 | value X | f | t | f
(4 rows)
现在我想将这些数据转置到特征上,使其看起来像下面这样
user_id | feature_1_value | feature_2_value | feature_3_value
---------+-----------------+-----------------+-----------------
2 | | value X |
1 | value a | value c | value b
(2 rows)
目前我正在使用以下方法进行此操作
WITH feature_1 AS (
SELECT user_id, value FROM features where feature_1
), feature_2 AS (
SELECT user_id, value FROM features where feature_2
), feature_3 AS (
SELECT user_id, value FROM features where feature_3
) SELECT
features.user_id
, feature_1.value AS feature_1_value
, feature_2.value AS feature_2_value
, feature_3.value AS feature_3_value
FROM
features
LEFT JOIN feature_1 ON features.user_id = feature_1.user_id
LEFT JOIN feature_2 ON features.user_id = feature_2.user_id
LEFT JOIN feature_3 On features.user_id = feature_3.user_id
GROUP BY features.user_id, feature_1_value, feature_2_value, feature_3_value;
随着越来越多的功能被添加,这开始变得笨拙。有没有更简单的方法?是否可以使用某种crosstab 查询?一些transpose 函数?
【问题讨论】:
-
如果一个以上的特征连续为真怎么办?如果没有,为什么不只存储功能名称?
标签: sql postgresql summarize