根据排序的升序列表(QGIS 中的SQL)将序号添加到新字段
Add sequential number to new field based on a sorted ascending list (SQL in QGIS)
我有一个线(分段道路)数据集,其中每条道路都有一个唯一的代码,但该道路可能是分段的。我想将唯一代码(位置)和序号(基于路段的起始里程)添加到新字段 (segment_id)。
我在 SQL 的 QGIS 风格中需要它,它只允许这些命令 - 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() 窗口函数。我看了文档,确实支持。
https://www.sqlite.org/windowfunctions.html#built_in_window_functions
您最有可能想要做的是在子 select 中“ROW_NUMBER() OVER (PARTITION BY LOCATION ORDER BY FID) AS RN”。然后将 RN 转换为 varchar 并将其连接到位置。类似于“CAST(Location as VARCHAR(30)) + '.' + CAST(RN AS VARCHAR(30)) AS Segment_ID
SELECT
*
,CAST(Location as VARCHAR(30))+ '.'+Cast(RowNum as VARCHAR(30)) AS Segment_ID
FROM
(
SELECT
ROW_NUMBER () OVER (
PARTITION BY Location
ORDER BY Start_Chainage
) RowNum, Location, RoadMntnc, Segments
from test_simple_roads) AS TEST
我有一个线(分段道路)数据集,其中每条道路都有一个唯一的代码,但该道路可能是分段的。我想将唯一代码(位置)和序号(基于路段的起始里程)添加到新字段 (segment_id)。
我在 SQL 的 QGIS 风格中需要它,它只允许这些命令 - 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() 窗口函数。我看了文档,确实支持。
https://www.sqlite.org/windowfunctions.html#built_in_window_functions
您最有可能想要做的是在子 select 中“ROW_NUMBER() OVER (PARTITION BY LOCATION ORDER BY FID) AS RN”。然后将 RN 转换为 varchar 并将其连接到位置。类似于“CAST(Location as VARCHAR(30)) + '.' + CAST(RN AS VARCHAR(30)) AS Segment_ID
SELECT
*
,CAST(Location as VARCHAR(30))+ '.'+Cast(RowNum as VARCHAR(30)) AS Segment_ID
FROM
(
SELECT
ROW_NUMBER () OVER (
PARTITION BY Location
ORDER BY Start_Chainage
) RowNum, Location, RoadMntnc, Segments
from test_simple_roads) AS TEST