我想要的是删除SQL服务器2016中任何重复的相邻城市代码,并用破折号(-)分隔.

源数据:

ID  ROUTE   LNO
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 ID, STUFF((
    SELECT '-' + ROUTE
    FROM DST
    WHERE ID = d.ID
    ORDER BY LNO
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS Route
FROM DST d
GROUP BY ID;

当前结果:

ID  Route
1   JFK-LAX-LAX_IAD-IAD-ORD
2   SEA-IAH-IAH-AUS-AUS-SEA
5   MIA-ATL-ATL-MIA

期望的结果:

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

演示 : https://dbfiddle.uk/uHs-Vx_G

推荐答案

除了开始和结束之外,它们都是重复的.所以首先不要重复代码!(假设每个机场代码为三个字符.)

SELECT ID, (
    SELECT case when rn = 1 then ROUTE else '-' + right(ROUTE, 3) end
    FROM DST d2
    WHERE ID = d.ID
    ORDER BY LNO
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') AS Route
FROM DST d
GROUP BY ID;

但考虑到字符串的长版本,并且知道所有代码的长度相同,并且如果您对机场数量有上限,那么您当然可以接受这样的长嵌套表达的 idea :

with dataX as (
    SELECT ID, STUFF((
        SELECT '-' + ROUTE
        FROM DST
        WHERE ID = d.ID
        ORDER BY LNO
        FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS Route
    FROM DST d
    GROUP BY ID
)
select Route7
from dataX cross apply (values(coalesce(stuff(Route,   9, 4, ''), Route ))) v2(Route2)
           cross apply (values(coalesce(stuff(Route2, 13, 4, ''), Route2))) v3(Route3)
           cross apply (values(coalesce(stuff(Route3, 17, 4, ''), Route3))) v4(Route4)
           cross apply (values(coalesce(stuff(Route4, 21, 4, ''), Route4))) v5(Route5)
           cross apply (values(coalesce(stuff(Route5, 25, 4, ''), Route5))) v6(Route6)
           cross apply (values(coalesce(stuff(Route6, 31, 4, ''), Route6))) v7(Route7);

...
from dataX cross apply (values(stuff(Route + replicate(' ', 100), 9, 4, ''))) v2(Route2)
           cross apply (values(stuff(Route2, 13, 4, ''))) v3(Route3)
           cross apply (values(stuff(Route3, 17, 4, ''))) v4(Route4)
           cross apply (values(stuff(Route4, 21, 4, ''))) v5(Route5)
           cross apply (values(stuff(Route5, 25, 4, ''))) v6(Route6)
           cross apply (values(rtrim(stuff(Route6, 31, 4, '')))) v7(Route7)

https://dbfiddle.uk/wArraPC0

Sql相关问答推荐

基于模式或其他行集的数据复制

使用交叉应用透视表在SQL中转换分段时间段&

如何使用ROW_NUM() Select 一个没有第二条记录的实例?

SQL:如何将相应位置的两个数组中的元素组合在一起

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

在子窗口SQL Presto中使用特定条件执行值计数

组合2个分区表的postgres视图的执行计划正在访问所有分区

使用与JOIN一起使用的查询后进行分页和排序

提取连续时间戳范围的SQL

将时间范围划分为全天和前后剩余小时

从输出中删除 jsonb_build_object

获取多个开始-结束时间戳集之间经过的时间

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

SQL 将 Varchar 转换为日期

如何从一张表中获取值在至少三行相同的记录

try 将多行折叠为单个结果

根据行号将列转置为没有任何id或键列的行

joins 组合多个重复数据删除策略

Select 多年的日期范围

SQL - 使用子查询返回多行的 LIKE 命令