sql - 在 postgresql 中加入多列

标签 sql database postgresql

我在 postgresql 中有以下两个表:

     TABLE: act_codes
    ===================
     activity  act_desc
    ____________________
        1      sleeping
        2      commuting
        3      eating
        4      working
     TABLE: data
    ===================
    act1_1     act_1_2     act1_3     act1_4
    ---------------------------------------------
      1         1           3           4
      1         2           2           3
      1         1           2           2
      1         2           2           3
      1         1           1           2
      1         1           3           4
      1         2           2           4
      1         1           1           3
      1         3           3           4
      1         1           4           4

act_codes 表基本上是一个事件表(带有代码和描述),数据表包含(在本例中)4 个不同时间(act1_1、act1_2、act1_3 和 act1_4)的事件代码。

我正在尝试对此进行查询以获取每个事件的计数表。我已经设法为每个单独的列(在本例中为 act1_4)执行此操作,如下所示:

    SELECT A.act_code, A.act_desc, COUNT (act1_4) 
    FROM act_codes AS A
    LEFT JOIN data AS D 
    ON D.act1_4 = A.act_code
    GROUP BY A.act_code, A.act_desc;   

这对于该列来说效果很好,但我有大量的列要处理,所以如果有一种方法可以在 SQL 查询中执行此操作,我会更喜欢它。


我现在有以下查询(非常感谢 banazs):

    SELECT
        ac.act_code, 
        ac.act_desc,
        act_time,
        COUNT(activity) AS act_count
    FROM
        (SELECT
            UNNEST(array['act1_1','act1_2','act1_3','act1_4']) AS act_time,
            UNNEST(array[d.act1_1, d.act1_2, d.act1_3, d.act1_4]) AS activity
        FROM
            data d) t
    RIGHT JOIN
        act_codes ac ON t.activity = ac.act_code
    GROUP BY
        ac.act_code, 
        ac.act_desc,
        act_time, activity
    ORDER BY 
        activity, 
        act_time
    ;

哪些输出:

    act_code        act_desc        act_time        act_count
    ---------------------------------------------------------
        1           sleeping            act1_1          10
        1           sleeping            act1_2          6
        1           sleeping            act1_3          2
        2           commuting           act1_2          3
        2           commuting           act1_3          4
        2           commuting           act1_4          2
        3           eating              act1_2          1
        3           eating              act1_3          3
        3           eating              act1_4          3
        4           working             act1_3          1
        4           working             act1_4          5

这基本上就是我要找的东西。理想情况下,可以以某种方式添加计数为零的行,但我猜测这可能最好作为一个单独的过程来完成(例如,在 R 中构建交叉表等)。

最佳答案

您可以使用UNNEST“反透视”数据:

   SELECT
        UNNEST(array['act1_1','act1_2','act1_3','act1_4']) AS column_name,
        UNNEST(array[d.act1_1, d.act1_2, d.act1_3, d.act1_4]) AS value
    FROM
        data d
    ;

计算事件数:

SELECT
    ac.act_code, 
    ac.act_desc,
    COUNT(*)
FROM
    (SELECT
        UNNEST(array['act1_1','act1_2','act1_3','act1_4']) AS column_name,
        UNNEST(array[d.act1_1, d.act1_2, d.act1_3, d.act1_4]) AS val
    FROM
        data d) t
INNER JOIN
    act_codes ac ON t.val = ac.act_code
GROUP BY
    ac.act_code, 
    ac.act_desc 
;

关于sql - 在 postgresql 中加入多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42339526/

相关文章:

mysql - 如果绑定(bind)字段为空,如何使用左连接发出请求 |数据库

mysql - 从不同的表生成用户帖子数和线程数

python - 我的下一个 Amazon Web Services (Linux) 项目应该选择什么? Ruby/Python/其他、MySQL/PostgreSQL/其他

postgresql - Postgres 触发器

sql - 如何使用序列和种子在我的选择输出中创建一列

sql - activerecord 相当于 SQL 'minus'

mysql - 如何修改此查询以添加一个新字段,其中包含原始记录总数的子集的字段的最大值?

mysql - 在没有存储过程、触发器或 UDF 的情况下实现父类(super class)型和子类型数据完整性

sql - 在单个查询中获取分页行和总数

sql - 我应该使用 LIKE 来查询具有 400 万行的表吗