結果, 2/3 是換乘次數(應該減一, 將上面代碼中初始化 line_count 的地方從1改成0即可):
3{1.廣州東-> 2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 2 5
1{1.廣州東-> 2.體育中心-> 3.體育西)-> 3{2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 3 7
數據的問題, 我的算法依賴於 orderid 來搜索下一站, 如果這個不連續, 則無法搜索下一站
所以把數據改成下面的就行了
SQL code
DECLARE @tb TABLE(
lineID int, state nvarchar(10), orderid int)
INSERT @tb
SELECT 1, N'廣州東', 1 UNION ALL
SELECT 1, N'體育中心', 2 UNION ALL
SELECT 1, N'體育西', 3 UNION ALL
SELECT 1, N'烈士陵園', 4 UNION ALL
--SELECT 1, N'公園前', 6 UNION ALL -- 這裡站點斷開了, 我的搜索要求連續
--SELECT 1, N'西門口', 7 UNION ALL
SELECT 1, N'公園前', 5 UNION ALL -- 這裡站點斷開了, 我的搜索要求連續
SELECT 1, N'西門口', 6 UNION ALL
SELECT 2, N'火車站', 1 UNION ALL
SELECT 2, N'紀念堂', 2 UNION ALL
SELECT 2, N'公園前', 3 UNION ALL
SELECT 2, N'中大', 4 UNION ALL
SELECT 2, N'客村', 5 UNION ALL
SELECT 2, N'琶洲', 6 UNION ALL
SELECT 2, N'萬勝圍', 7 UNION ALL
SELECT 3, N'廣州東', 1 UNION ALL
SELECT 3, N'體育西', 2 UNION ALL
SELECT 3, N'珠江新城', 3 UNION ALL
SELECT 3, N'客村', 4 UNION ALL
SELECT 3, N'市橋', 5 UNION ALL
SELECT 4, N'萬勝圍', 1 UNION ALL
SELECT 4, N'金洲', 2
修改後的執行結果(換乘數已經改成初始化為0)
3{1.廣州東-> 2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 1 5
3{1.廣州東-> 2.體育西)-> 1{3.體育西-> 4.烈士陵園-> 5.公園前)-> 2{3.公園前-> 4.中大} 2 6
1{1.廣州東-> 2.體育中心-> 3.體育西-> 4.烈士陵園-> 5.公園前)-> 2{3.公園前-> 4.中大} 1 6
1{1.廣州東-> 2.體育中心-> 3.體育西)-> 3{2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 2 7
如果 orderid 在實際數據中確實有不連續的問題, 則可以在處理之前先把數據導到臨時表, 生成連續的 orderid, 再用我的算法來查詢結果。這次的算法相比之前的算法有改進, 只有換乘才會判斷是否已經走過此線路, 其他方面也略有調整, 應該比以前的好。你可以測試一下!
實際使用時, 算法上可以稍做調到:
1. 直接計算出 next_orderid, 而不是每次用 flag 去算, 這樣可以提高 join 效率
2. 表變量改成臨時表, 這樣可以在相關的列上建立索引, 從而更快的與原表 join (當然, 原表相關的列上也要有索引)