2014-01-28 61 views
2

所以我一直在與此戰鬥一段時間,我認爲這必須是一個簡單的任務。我的目標是返回由正斜槓分隔的所有唯一行的單個字符串,並在輸入時排序。下面是示例數據如何在SQL Server 2008+中使用ORDER BY和FOR SELECT選擇DISTINCT

表:位置

Location Time 
======== ======= 
OR1  2013-02-06 16:55:47.000 
OR1  2013-02-06 16:56:34.000 
ICU1  2013-02-06 16:59:50.000 
OR1  2013-02-06 17:02:50.000 
ICU1  2013-02-06 17:09:50.000 

所以給出的數據上表我想返回一個字符串,說這「OR 1/ICU1」。我可以使用FOR XML PATH將不同的值作爲字符串返回,但只要我拋出ORDER BY,它就會全部崩潰並出錯。

想法?

回答

6

嘗試一下;

SELECT STUFF ((
    SELECT cast('/' as Varchar(max)) + Location 
    From Locations 
    Group by Location 
    Order by MAX(Time) FOR XML PATH('')) , 1 , 1 , '') as result 
+0

這裏是sqlfiddle此方法 http://sqlfiddle.com/#!3/e528e/2 – HKImpact

+0

哈!我從來不知道命令STUFF。我以爲你只是在做點什麼。這工作很好,但。謝謝。 – mdutra

+0

不客氣mdutra。 – soysal

0

在查詢和while循環中使用一個臨時表,但我不建議這樣做,否則可能會對性能可能受到負面影響的大型生產數據這樣做。

例如。

/*Create our temp table */ 
DECLARE @MyTemp TABLE (Location VARCHAR(10), Processed BIT DEFAULT 0) 

/*Load the temp table will all the distinct locations */  
INSERT INTO @MyTemp SELECT DISTCINT Location FROM Locations 

/* need these variable to hold data */  
DECLARE @FinalString VARCHAR(1000) = '' 
DECLARE @Location VARCHAR(10) = '' 

/*as long as there is any row with an unprocessed location in the table 
we want to continue this process */ 
WHILE EXISTS(SELECT 1 FROM @MyTemp WHERE Processed = 0) 
BEGIN 
    /* Grab our next unprocessed location */ 
    SELECT TOP 1 @Location = Location FROM @MyTemp WHERE Processed = 0 ORDER BY Location 
    /* Add it to the final string */ 
    SET @FinalString = @FinalString + '/' + @Location 
    /* mark the location as processed */ 
    UPDATE @MyTemp SET Processed = 1 WHERE Location = @Location 
END 

/* get the final result (note this will have a leading '/') */ 
SELECT @FinalString