sql-server - 指定 CollectionAggregate 使用的顺序

标签 sql-server t-sql geometry concatenation geospatial

我正在强制 GEOMETRYCOLLECTION 中包含几何图形的顺序。通过连接 wkt 并使用 STUFFORDER BY

(我使用的是 SQL Server 2016,否则我会使用 STRING_AGG )

DECLARE @OrderedGeometryList TABLE  
(  
    [GroupId] INT,
    [Geometry] GEOMETRY,
    [Order] INT
)  


INSERT @OrderedGeometryList
VALUES 
     (1, 'LINESTRING(3 3, 4 4)', 3)
    ,(1, 'LINESTRING(0 0, 1 1)', 1)
    ,(1, 'LINESTRING(1 1, 2 2)', 2)
    ,(2, 'POINT(35453 141)', 2)
    ,(2, 'MULTILINESTRING((0 0, 1 1),(2 2, 3 3))', 1)

然后

;WITH Grouped AS (
    SELECT 
        [GroupId]
        ,Geometry::STGeomCollFromText(
            'GEOMETRYCOLLECTION(' + 
                STUFF((
                    SELECT ',' + [Geometry].ToString()
                    FROM @OrderedGeometryList t2
                    WHERE t1.[GroupId] = t2.[GroupId] 
                    ORDER BY [Order]
                    FOR XML PATH ('')
                ), 1, 1, '')
            + ')', MAX([Geometry].STSrid)
        ) as [Geometry]
    FROM @OrderedGeometryList t1
    GROUP BY [GroupId]
)


SELECT GroupId, Geometry.ToString() as WKT
FROM Grouped

产品:

GroupId WKT
1   GEOMETRYCOLLECTION (LINESTRING (0 0, 1 1), LINESTRING (1 1, 2 2), LINESTRING (3 3, 4 4))
2   GEOMETRYCOLLECTION (MULTILINESTRING ((0 0, 1 1), (2 2, 3 3)), POINT (35453 141))

请注意收集顺序(从左到右)如何遵循表中指定的顺序。这就是我想要的效果,但我很好奇是否有更干净的方法来做到这一点。

我考虑编写自己的 CLR 聚合,然后使用 OVER()ORDER BY但似乎不支持Is it possible to use user defined aggregates (clr) with window functions (over)?

最佳答案

您可以在子查询中使用 OFFSET 来对行进行排序。

SELECT Geometry::CollectionAggregate([Geometry]).ToString() 
FROM 
    (SELECT * FROM @OrderedGeometryList ORDER BY [GroupId], [Order] OFFSET 0 ROWS) T
GROUP BY [GroupId]

结果:

GEOMETRYCOLLECTION (LINESTRING (0 0, 1 1), LINESTRING (1 1, 2 2), LINESTRING (3 3, 4 4))
GEOMETRYCOLLECTION (MULTILINESTRING ((0 0, 1 1), (2 2, 3 3)), POINT (35453 141))

关于sql-server - 指定 CollectionAggregate 使用的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272742/

相关文章:

sql - 在 Select 中使用存储过程 (T-SQL)

sql - 如何在 T-SQL 中执行相当于 "SHOW TABLES"的操作?

sql - 计算连续天数 SQL Server

javascript - 网页设计圆弧圈效果

c# - 使用 Transaction Binding=Explicit Unbind 时连接不会关闭;在连接字符串中

sql-server - 仅选择 "customer"的所有行都具有相同状态的位置?

javascript - 如何排列圆圈以使用尽可能小的空间?

圆上两度之间最短行进方向的算法或公式?

php - 减少左连接查询执行时间

sql-server - 为什么 Invoke-Sqlcmd -OutputAs DataTables 为一条记录和多条记录返回不同的类型