【发布时间】:2021-11-20 11:51:48
【问题描述】:
我有一个线(分段道路)数据集,其中每条道路都有一个唯一的代码,但这条道路可能是分段的。我想将唯一代码(位置)和序号(基于段的起始里程)添加到新字段(段_id)。
我需要它在 QGIS 风格的 SQL 中,只允许这些命令 -https://sqlite.org/lang.html?
下面的示例在最后一个(Segment_ID)列中包含我想要结束的字段
fid RoadMntnc Location Segments Start_Chainage Segment_ID
640 Albatross_Cl 3 1 0 3.1
606 Allamanda_St 4 1 0 4.1
620 Barrbal_Dr 25 5 0 25.1
624 Barrbal_Dr 25 5 50 25.2
628 Barrbal_Dr 25 5 130 25.3
1092 Barrbal_Dr 25 5 180 25.4
1093 Barrbal_Dr 25 5 250 25.5
600 Bayil_Dr 27 2 120 27.2
601 Bayil_Dr 27 2 0 27.1
我们需要按位置分组,然后为每个组获取 Start_Chainage 的升序列表,然后将 1-x 插入位置值以获取 Location.Segment#
这可能纯粹在 SQL 中实现,还是我需要使用 Python?
==== 更新的代码示例基于 QuestionGuyBob 的建议
select ROW_NUMBER () OVER (
PARTITION BY Location
ORDER BY Start_Chainage
) RowNum, Location, RoadMntnc, Segments,
CAST(Location as VARCHAR(30))+ '.'+Cast(RowNum as VARCHAR(30)) AS Segment_ID
from test_simple_roads
报错
Query preparation error on PRAGMA table_info(_tview): no such column: RowNum
如果我将 RowNum 更改为另一个字段,它不会连接而是将两个整数相加
如果我将其更改为 concat 它可以工作,但我仍然无法使用 RowNum 或 Row_Number,因为我得到了相同的错误(没有这样的列)。
concat(Location, '.',RowNum) AS Segment_ID
【问题讨论】:
-
我并没有完全看到您的最终目标是什么。你能提供一个输出应该是什么样子的样本吗?我想到的第一个想法是使用类似 ROW_NUMBER() OVER (PARTITION BY LOCATION ....
-
这是表格的最后一列。因此,对于位置为 27 的 fid 600,我们需要 segment_id 为 27.2,因为它从 120m 开始,对于 601,它应该是 27.1,因为它是从 0m 开始的第一段。