根据排序的升序列表(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