【问题标题】:How to SELECT DISTINCT with an ORDER BY and FOR XML in SQL Server 2008+如何在 SQL Server 2008+ 中使用 ORDER BY 和 FOR XML 选择 DISTINCT
【发布时间】:2014-01-28 21:37:40
【问题描述】:

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

表格:位置

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,它就会因错误而崩溃。

想法?

【问题讨论】:

    标签: sql distinct for-xml-path


    【解决方案1】:

    试试看;

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

    【讨论】:

    • 哈!我从来不知道命令 STUFF。我以为你只是在编造一些东西。不过这效果很好。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多