SQL Server中的网络数据 - 标识单独的路由

时间:2017-02-09 13:40:45

标签: tsql search networking neural-network

我正在寻找数据库任务的帮助,这可能更容易通过某种对象编程语言来解决。此刻我一直在努力寻找它的TSQL / SQL Server解决方案。

我使用的源表包含有关路由的数据。每条记录都描述了routeNo,originNodeID和destinationNodeID的路由链接。此表中最复杂的数据示例如下所示:

routeID originNodeID destinationNodeID
 WRTV    ...             ...
 WRTX    5               10
 WRTX    10              15
 WRTX    15              20
 WRTX    20              25
 WRTX    25              30
 WRTX    25              1505
 WRTX    25              2005
 WRTX    30              35
 WRTX    30              1005
 WRTX    35              40
 WRTX    40              45
 WRTX    45              50
 WRTX    1005            1010
 WRTX    1015            1020
 WRTX    1505            1510
 WRTX    1510            1515 
 WRTX    2005            2010
 WRTX    2010            2015 
 WRTX    2020            2025 
 WRTY    ....            ....

因此,您可以看到每个routeID都不是线性路由,而是带分支的路由。示例中的路径可能如下所示:

               1515    1020
                /     /
               /     /
   5 ------ 25 --- 30 -------50  
              \
               \
                2025

现在,我需要做的是将这条路线分解为不同的路线:

5-25-30-50 WRTX1 WRTX2 5-25-30-1020 5月15-1515 WRTX3 5-25-2025 WRTX4

对于每个新路线,我只需要如下链接序列:

routeID originNodeID destinationNodeID
     WRTX1    5               10
     WRTX1    10              15
     WRTX1    15              20
     WRTX1    20              25
     WRTX1    25              30
     WRTX1    30              35
     WRTX1    35              40
     WRTX1    40              45
     WRTX1    45              50
     WRTX2    5               10
     WRTX2    10              15
     WRTX2    15              20
     WRTX2    20              25
     WRTX2    25              30
     WRTX2    30              1005
     WRTX2    1005            1010
     WRTX2    1015            1020 
     WRTX3    5               10
     WRTX3    10              15
     WRTX3    15              20
     WRTX3    20              25
     WRTX3    25              1505
     WRTX3    1505            1510
     WRTX3    1510            1515 
     WRTX4    5               10
     WRTX4    10              15
     WRTX4    15              20
     WRTX4    20              25
     WRTX4    25              2005
     WRTX4    2005            2010
     WRTX4    2010            2015 
     WRTX4    2020            2025 

你知道如何解决我的问题吗?我希望在SQL Server中提供这个解决方案,但我对循环和游标的经验很少,在这种情况下可能会有用。有一次我甚至做了一个ETL,但它只在只有一个路径分裂时工作。

如果有任何帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

并非您在sql中编程所需的所有操作。没有通用的编程语言。某些操作需要在其他编程语言中完成。对于您的任务,最好将python与sql数据库一起使用。

您可以在python中编辑一行并插入数据库。你能给出一个示例脚本,但你必须带正确的字符串" 5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4"并正确的数据表示例。

在你的表中有数字10,但它们不在上面的行中。在这方面,不了解字符串的分解机制" 5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4"。例如," 5-25-30-50 WRTX1"分解"" 5 25 WRTX1","" 25 30 WRTX1","" 30 50 WRTX1"?等等?

PYTHON + MSSQL的示例

import pymssql
import re
ServName = 'YourMSSQLServName'
DBName = 'YourDBName'

conn = pymssql.connect(server=ServName, database=DBName)
cursor = conn.cursor()
querytxt = '''
INSERT INTO [routing]
           ([routeID] ,[originNodeID] ,[destinationNodeID])
VALUES
           ('@routeID', @originNodeID , @destinationNodeID)'''
limit = 1000
Mask = 'WRTX'
F = open('rote.txt', 'r')
L = [R.strip() for R in F]
for Line in L:
    LineLast = Line  
    j = 1
    while len(LineLast) != 0:
        PingLines = LineLast.partition(Mask)[0].strip()
        LineTemp = LineLast.partition(Mask)[2].strip()
        Num = LineTemp[0]    
        LineLast = LineTemp.partition(' ')[2]
        PingSet = PingLines.split('-')        
        i = 0
        while i < len(PingSet)-1:
            Ping1 = PingSet[i]
            Ping2 = PingSet[i+1]
            i = i + 1            
            routeID = Mask + Num
            originNodeID = Ping1
            destinationNodeID = Ping2
            print('Mask = %s\tPing1 = %s\tPing2 = %s' % (routeID , originNodeID, destinationNodeID))
            query = querytxt.replace('@routeID', routeID)
            query = query.replace('@originNodeID', originNodeID)
            query = query.replace('@destinationNodeID', destinationNodeID)
            cursor.execute(query)
            conn.commit()
            if i >= limit : break        
        j = j + 1
        if j >= limit : break
F.close()