【问题标题】:PostgreSQL summarize features queryPostgreSQL 汇总特征查询
【发布时间】: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


【解决方案1】:

您需要在此处进行数据透视查询:

SELECT
    user_id,
    MAX(value) FILTER (WHERE feature_1) AS feature_1_value,
    MAX(value) FILTER (WHERE feature_2) AS feature_2_value,
    MAX(value) FILTER (WHERE feature_3) AS feature_3_value
FROM features
GROUP BY
    user_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2012-09-20
    • 2020-09-15
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多