【发布时间】:2014-06-25 07:21:12
【问题描述】:
我有关于企业的长格式数据,每次移动到不同位置时对应一行,以企业 ID 为键 - 任何一个企业机构都可以有多个移动事件。
我希望重塑为宽格式,这通常是每个 tablefunc 模块的跨表区域。
+-------------+-----------+---------+---------+
| business_id | year_move | long | lat |
+-------------+-----------+---------+---------+
| 001013580 | 1991 | 71.0557 | 42.3588 |
| 001015924 | 1993 | 71.0728 | 42.3504 |
| 001015924 | 1996 | -122.28 | 37.654 |
| 001020684 | 1992 | 84.3381 | 33.5775 |
+-------------+-----------+---------+---------+
然后我像这样变换:
SELECT longbyyear.*
FROM crosstab($$
SELECT
business_id,
year_move,
max(longitude::float)
from business_moves
where year_move::int between 1991 and 2010
group by business_id, year_move
order by business_id, year_move;
$$
)
AS longbyyear(biz_id character varying, "long91" float,"long92" float,"long93" float,"long94" float,"long95" float,"long96" float,"long97" float, "long98" float, "long99" float,"long00" float,"long01" float,
"long02" float,"long03" float,"long04" float,"long05" float,
"long06" float, "long07" float, "long08" float, "long09" float, "long10" float);
它——主要是——让我得到想要的输出。
+---------+----------+----------+----------+--------+---+--------+--------+--------+
| biz_id | long91 | long92 | long93 | long94 | … | long08 | long09 | long10 |
+---------+----------+----------+----------+--------+---+--------+--------+--------+
| 1000223 | 121.3784 | 121.3063 | 121.3549 | 82.821 | … | | | |
| 1000678 | 118.224 | | | | … | | | |
| 1002158 | 121.98 | | | | … | | | |
| 1004092 | 71.2384 | | | | … | | | |
| 1007801 | 118.0312 | | | | … | | | |
| 1007855 | 71.1769 | | | | … | | | |
| 1008697 | 71.0394 | 71.0358 | | | … | | | |
| 1008986 | 71.1013 | | | | … | | | |
| 1009617 | 119.9965 | | | | … | | | |
+---------+----------+----------+----------+--------+---+--------+--------+--------+
唯一的障碍是,理想情况下,我会为每年填充值,而不仅仅是移动年份的值。因此,所有字段都将被填充,每年都有一个值,最近的地址会延续到下一年。如果每个都是空白的,我可以通过手动更新来解决这个问题,使用上一列,我只是想知道是否有一个聪明的方法可以使用 crosstab() 函数或其他方式,可能与自定义函数相结合。
【问题讨论】:
-
没有自动的方法来执行此操作 afaik 因为您需要未存储在数据库中的信息。实际上,您想从 event 数据(我的企业在哪一年迁移到新的经度?)创建 state 信息(我的企业在某年位于哪里?) .可以这样做,但会很丑陋。你能详细说明你想要达到的目标吗?而且,如果你想得到一个真正可行的答案,请张贴表格结构。
-
@Patrick,表格结构显示在顶部,前三行无论如何 - 尽管列名略有不同。但我基本上是在为每个业务查找表,因此给定一年,我可以从表中获取相应的位置(纬度、经度对,或者作为二维数组,或者在单独的表中)。
-
那么我假设您想回答“我的企业在 x 年位于哪里?”这样的问题是否正确?
-
确实,总结一下——我意识到存储每年的数据有大量冗余,因为大多数企业不会移动那么多,但整个数据库是一组宽格式平面文件键入业务 ID,按年份为每个业务(就业、行业代码等)提供各种变量。
-
我假设您对每个
business_move都有一个日期,而不仅仅是年份?我还假设,您实际上并不想要每年最大的latitude?最后我假设您不仅想要latitude,还想要longitude?
标签: sql postgresql postgresql-9.1 crosstab generate-series