繁体   English   中英

如何在SQL Server 2008+中使用ORDER BY和FOR XML选择DISTINCT

[英]How to SELECT DISTINCT with an ORDER BY and FOR XML in SQL Server 2008+

所以我现在已经和它斗争了一段时间,我认为这必须是一项简单的任务。 我的目标是返回一个字符串,其中返回的所有唯一行都以正斜杠分隔,并按输入时间排序。 这是示例数据

表:地点

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

因此,鉴于上面的数据表,我想返回一个表示“OR1 / ICU1”的字符串。 我可以使用FOR XML PATH将不同的值作为字符串返回,但是一旦我抛出ORDER BY,它就会因错误而崩溃。

想法?

试试吧;

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

在查询中使用临时表和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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM