我在 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/