SQL Server 2016 中的 STRING_AGG 函数等效

问题描述 投票:0回答:1

任何人都可以将此语句从 SQL Server 2019 转换为 2016 吗?我想用“-”连接路线字段,然后按 ID 分组并按 LNO 排序,但我需要删除重复的城市,例如MIA-ATL-ATL-MIA 需要删除一个ATL,它应该是MIA-ATL-MIA。

我的询问:

SELECT
ID,STRING_AGG(ROUTE, '-') WITHIN GROUP (ORDER BY LNO) AS ROUTING
FROM
(
SELECT '1' ID, 'JFK-LAX' ROUTE, '1' LNO UNION ALL
SELECT '1' ID, 'LAX_IAD' ROUTE, '2' LNO UNION ALL
SELECT '1' ID, 'IAD-ORD' ROUTE, '3' LNO UNION ALL
SELECT '5' ID, 'MIA-ATL' ROUTE, '1' LNO UNION ALL
SELECT '5' ID, 'ATL-MIA' ROUTE, '2' LNO UNION ALL
SELECT '2' ID, 'SEA-IAH' ROUTE, '1' LNO UNION ALL
SELECT '2' ID, 'IAH-AUS' ROUTE, '2' LNO UNION ALL
SELECT '2' ID, 'AUS-SEA' ROUTE, '3' LNO
) DST
GROUP BY ID

期望的结果:

ID  ROUTING
1   JFK-LAX_IAD-ORD
2   SEA-IAH-AUS-SEA
5   MIA-ATL-MIA

演示:https://dbfiddle.uk/lscKOURc

sql sql-server
1个回答
0
投票

我还没有完全完成。但它给了你一个想法。 我的方法 - SQL 2022 和 2016

--SQL 2022
SELECt 
    x.ID, X.ROUTING
    , FixedRoute = (SELECT STRING_AGG(x.value, '-') FROM (select DISTINCT value from string_split(x.ROUTING, '-', 0)) x)
FROM
(
SELECT
ID, STRING_AGG(ROUTE, '-') WITHIN GROUP (ORDER BY LNO) AS ROUTING
FROM
(
SELECT '1' ID, 'JFK-LAX' ROUTE, '1' LNO UNION ALL
SELECT '1' ID, 'LAX-IAD' ROUTE, '2' LNO UNION ALL
SELECT '1' ID, 'IAD-ORD' ROUTE, '3' LNO UNION ALL
SELECT '5' ID, 'MIA-ATL' ROUTE, '1' LNO UNION ALL
SELECT '5' ID, 'ATL-MIA' ROUTE, '2' LNO UNION ALL
SELECT '2' ID, 'SEA-IAH' ROUTE, '1' LNO UNION ALL
SELECT '2' ID, 'IAH-AUS' ROUTE, '2' LNO UNION ALL
SELECT '2' ID, 'AUS-SEA' ROUTE, '3' LNO
) DST
GROUP BY ID
) as x
GO

--SQL 2016

Declare @t Table (ID int, ROUTE varchar(30), LNO int);
 Insert Into @t 
 Values 
 (1, 'JFK-LAX', 1),
(1, 'LAX-IAD', 2),
(1, 'IAD-ORD', 3),
(5, 'MIA-ATL', 1),
(5, 'ATL-MIA', 2),
(2, 'SEA-IAH', 1),
(2, 'IAH-AUS', 2),
(2, 'AUS-SEA', 3)


SELECT 
    x.ID
    ,x.Route
    --,dbo.FixRoute(x.Route) make function to remove duplicates
FROM
(
 Select Distinct
        ID,
        Route = stuff((Select concat('-', t2.ROUTE)
                      From @t t2
                     Where t2.ID = t.ID
                      order by t2.LNO
                       For xml path (''), Type).value('.', 'varchar(100)'), 1, 1, '')
From @t t
) x

sql 2022

身份证 路由 固定路线
1 JFK-LAX-LAX-IAD-IAD-ORD IAD-JFK-LAX-ORD
2 SEA-IAH-IAH-AUS-AUS-SEA 澳大利亚-IAH-海
5 MIA-ATL-ATL-MIA ATL-MIA

sql 2016

身份证 路线
1 JFK-LAX-LAX-IAD-IAD-ORD
2 SEA-IAH-IAH-AUS-AUS-SEA
5 MIA-ATL-ATL-MIA
© www.soinside.com 2019 - 2024. All rights reserved.