PostgreSQL交叉表与计数查询或任何其他方式
我正试图找出PostgreSQL中的PostgreSQL交叉表与计数查询或任何其他方式,sql,postgresql,crosstab,Sql,Postgresql,Crosstab,我正试图找出PostgreSQL中的交叉表函数,但我遇到了问题。我读了几个问题和答案,但由于某些原因,我无法根据需要转换您的答案。 我有一张如下所示的表格: start1 finish1 year1 1 1 2015 1 2 2013 1 1 2011 1 3 2011 2 2 2014 2 2 2011 2 1 2012 2
交叉表
函数,但我遇到了问题。我读了几个问题和答案,但由于某些原因,我无法根据需要转换您的答案。
我有一张如下所示的表格:
start1 finish1 year1
1 1 2015
1 2 2013
1 1 2011
1 3 2011
2 2 2014
2 2 2011
2 1 2012
2 3 2015
3 1 2010
create table test (
start1 int, finish1 int, year1 int);
insert into test values
(1,1,2015),(1,2,2013),
(1,1,2011),(1,3,2011),
(2,2,2014),(2,2,2011),
(2,1,2012),(2,3,2015),
(3,1,2010);
finish
start : 1 : 2 : 3
1 : 2 : 1 : 1
2 : 1 : 2 : 1
3 : 1 : 0 : 0
我希望得到如下结果:
start1 finish1 year1
1 1 2015
1 2 2013
1 1 2011
1 3 2011
2 2 2014
2 2 2011
2 1 2012
2 3 2015
3 1 2010
create table test (
start1 int, finish1 int, year1 int);
insert into test values
(1,1,2015),(1,2,2013),
(1,1,2011),(1,3,2011),
(2,2,2014),(2,2,2011),
(2,1,2012),(2,3,2015),
(3,1,2010);
finish
start : 1 : 2 : 3
1 : 2 : 1 : 1
2 : 1 : 2 : 1
3 : 1 : 0 : 0
拥有所有的起点和终点,并计算它们在同一点上完成的次数
为了实现上述输出,我编写了如下查询:
SELECT *
FROM crosstab(
'SELECT polygon_id, count(dest_polygon_id)
FROM test
ORDER BY 1,2')
AS ct ("start" int, "finish" int);
但是,它的输出并不像预期的那样正确。请帮帮我。我认为这种类型的查询很容易通过条件聚合完成:
select start1,
sum(case when finish1 = 1 then 1 else 0 end) as finish1,
sum(case when finish1 = 2 then 1 else 0 end) as finish2,
sum(case when finish1 = 3 then 1 else 0 end) as finish3
from test
group by start1
order by start1;
这是正确的,但我正在处理大数据,我有18万个起点和终点。是否有任何可能的解决方案可以同时处理所有数据?我的意思是,我有从1到数百万的数字,而不是从1到3。抱歉,再次尝试,但我再次添加了一行,它没有给出正确的答案。为了进一步澄清,我正在寻找一种方法,就像下一页的示例1中所写的那样:但这里是pivot,我不能将pivot与postgresql一起使用(我想)