我已PostgreSQL中以下兩個表:具有多個列的JOIN 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中構建交叉表)。
請確認:'data'表中每次都有一個單獨的列嗎? – Richard
重做數據庫設計。 –
數據表中的列對應於時間段(例如,act1_1是前5分鐘,act1_2是第二個等)。不是我的設計 - 所以我必須使用這種形狀的數據。 –