sql - 根据排序的升序列表将序号添加到新字段(QGIS中的SQL)
问题描述
我有一个线(分段道路)数据集,其中每条道路都有一个唯一的代码,但那条道路可能是分段的。我想将唯一代码(位置)和序号(基于段的起始里程)添加到新字段(段_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() 窗口函数。我查看了文档,它确实支持它。
https://www.sqlite.org/windowfunctions.html#built_in_window_functions
您最可能想要做的是在子选择中“ROW_NUMBER() OVER (PARTITION BY LOCATION ORDER BY FID) AS RN”。然后将 RN 转换为 varchar 并将其连接到位置。像“CAST(位置为 VARCHAR(30))+'。' + CAST(RN AS VARCHAR(30)) 作为 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
推荐阅读
- mysql - MySQL - 备份 90 天以上数据的最佳方式
- sql - GCP Query - 如何写年差?
- javascript - 使用 querySelectorAll 动态更改输入值
- python-3.x - Python 初学者(需要帮助)- 如何使 While 循环仅接受某些用户输入?
- c - 结构和联合:从性能的角度来看哪个更好?通过值或指针传递参数?
- css - 突出显示 React/Gatsby 中的活动页面链接
- sql - 坚持join左侧的行数
- reactjs - Babel 要么在边缘工作,要么因玩笑而失败,反之亦然
- c++ - 如何配置我的 CMake 项目以运行所有单元测试?
- asp.net - asp Dropdownlist 多项选择