的folllowing會做的伎倆,但換來的答案我想你谷歌「遞歸」,看看谷歌建議搜索:)
澄清:遞歸通過加入行 - 1到臨時表和CTE之間的行而發生。此方法取決於具有獨立的IDENTITY
列(在此情況下爲ID
),並使用ROWNUMBER()
來解決ID中可能存在的任何空白。由於ROW_NUMBER()
不能用於JOIN
我不得不求助於在CTE
的遞歸部分使用子查詢。即使你知道你有連續的ID,但我仍建議使用ROW_NUMBER
來進行這種查詢,只是爲了安全起見,因爲間隙會讓它變得混亂起來。
CREATE TABLE #tmp (id INT IDENTITY(1,1),stringname NVARCHAR(MAX))
INSERT #tmp (stringname)
VALUES
('stringA')
,('stringA')
,('stringB')
,('stringB')
,('stringA')
,('stringC')
,('stringC')
,('stringC')
,('stringA')
;WITH StringNames
AS(
SELECT
ROW_NUMBER() OVER (ORDER BY ID) AS Row --Accounts for gaps in ID
,stringname
,CAST(NULL AS NVARCHAR(MAX)) AS previous_stringname
FROM #tmp
WHERE id = 1
UNION ALL
SELECT t.Row
,t.stringname
,s.stringname AS previous_stringname
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY ID) AS Row --Accounts for gaps in ID
,stringname
FROM #tmp) AS t
JOIN StringNames AS s ON t.row - 1 = s.row
)
SELECT
DISTINCT
stringname
,previous_stringname
,COUNT(*) AS count
FROM StringNames
GROUP BY
stringname
,previous_stringname
ORDER BY stringname
來源
2011-10-04 16:04:58
Wil
我不確定您能否在SQL中輕鬆完成此操作。你最好查詢數據並讓程序處理邏輯。 –
期待ROW_NUMBER()和自加入 –
ROW_NUMBER不會幫助,因爲您無法按順序使用常量。您需要在表中添加另一個標識符,例如'IDENTITY'列,以確保按您希望的順序查詢字符串名稱。 – Wil