分组并添加列
Group By and add columns
我有一个名为 'ward_councillors' 的 table 和两列 'ward' 和 'councillor'。此 table 包含所有议员及其负责的选区的列表。每个选区有三名议员,我需要做的是分组,这样我每个选区都有一个不同的记录和三个新列,每个选区的三名议员负责。
例如目前有:
WARD | COUNCILLOR
ward a | cllr 1
ward a | cllr 2
ward a | cllr 23
ward b | cllr 4
ward b | cllr 5
ward b | cllr 8
努力实现:
WARD | COUNCILLOR 1| COUNCILLOR 2| COUNCILLOR 3
ward a | cllr 1 | cllr 2 | cllr 23
ward b | cllr 4 | cllr 5 | cllr 8
提前致谢,
克里斯
我倾向于使用条件聚合来处理此类查询:
select ward,
max(case when seqnum = 1 then councillor end) as councillor1,
max(case when seqnum = 2 then councillor end) as councillor2,
max(case when seqnum = 3 then councillor end) as councillor3
from (select wc.*,
row_number() over (partition by ward order by councillor) as seqnum
from ward_councillors wc
) wc
group by ward;
我对 sqlFiddle 有疑问,但我在本地 postgres 上写了这个:
CREATE TABLE ward_councillors (
ward VARCHAR
, councillor VARCHAR
);
INSERT INTO ward_councillors
VALUES
('ward a', 'cllr 1')
, ('ward a', 'cllr 2')
, ('ward a', 'cllr 23')
, ('ward b', 'cllr 4')
, ('ward b', 'cllr 5')
, ('ward b', 'cllr 8')
;
SELECT *
FROM crosstab('SELECT ward, null /*doesnt really matter*/, councillor FROM ward_councillors')
AS (ward VARCHAR, councillor_1 VARCHAR, councillor_2 VARCHAR, councillor_3 VARCHAR, councillor_4 VARCHAR)
;
似乎输出了你想要的:
ward | councillor_1 | councillor_2 | councillor_3 | councillor_4
--------+--------------+--------------+--------------+--------------
ward a | cllr 1 | cllr 2 | cllr 23 |
ward b | cllr 4 | cllr 5 | cllr 8 |
(2 rows)
都在这里描述了:http://www.postgresql.org/docs/9.1/static/tablefunc.html#AEN142967
我有一个名为 'ward_councillors' 的 table 和两列 'ward' 和 'councillor'。此 table 包含所有议员及其负责的选区的列表。每个选区有三名议员,我需要做的是分组,这样我每个选区都有一个不同的记录和三个新列,每个选区的三名议员负责。
例如目前有:
WARD | COUNCILLOR
ward a | cllr 1
ward a | cllr 2
ward a | cllr 23
ward b | cllr 4
ward b | cllr 5
ward b | cllr 8
努力实现:
WARD | COUNCILLOR 1| COUNCILLOR 2| COUNCILLOR 3
ward a | cllr 1 | cllr 2 | cllr 23
ward b | cllr 4 | cllr 5 | cllr 8
提前致谢, 克里斯
我倾向于使用条件聚合来处理此类查询:
select ward,
max(case when seqnum = 1 then councillor end) as councillor1,
max(case when seqnum = 2 then councillor end) as councillor2,
max(case when seqnum = 3 then councillor end) as councillor3
from (select wc.*,
row_number() over (partition by ward order by councillor) as seqnum
from ward_councillors wc
) wc
group by ward;
我对 sqlFiddle 有疑问,但我在本地 postgres 上写了这个:
CREATE TABLE ward_councillors (
ward VARCHAR
, councillor VARCHAR
);
INSERT INTO ward_councillors
VALUES
('ward a', 'cllr 1')
, ('ward a', 'cllr 2')
, ('ward a', 'cllr 23')
, ('ward b', 'cllr 4')
, ('ward b', 'cllr 5')
, ('ward b', 'cllr 8')
;
SELECT *
FROM crosstab('SELECT ward, null /*doesnt really matter*/, councillor FROM ward_councillors')
AS (ward VARCHAR, councillor_1 VARCHAR, councillor_2 VARCHAR, councillor_3 VARCHAR, councillor_4 VARCHAR)
;
似乎输出了你想要的:
ward | councillor_1 | councillor_2 | councillor_3 | councillor_4
--------+--------------+--------------+--------------+--------------
ward a | cllr 1 | cllr 2 | cllr 23 |
ward b | cllr 4 | cllr 5 | cllr 8 |
(2 rows)
都在这里描述了:http://www.postgresql.org/docs/9.1/static/tablefunc.html#AEN142967