如何获得连续的最高值以及所有列的名称是否相等

时间:2018-08-02 11:54:49

标签: sql sql-server tsql

我需要获得一行中最高的值以及该列的名称。问题是在一个分区中可能有多个相等的值。因此,我希望得到的结果是在一栏中获得最高的价值,在这种情况下,所有列的名称均以逗号分隔。

这个问题与我以前的问题完全相关:

How to get the highest value in a row together with the column name

让我们使用上一个问题中的Shnugo示例。

DECLARE @tbl TABLE(ID INT IDENTITY,d1 DATE, d2 DATE, d3 DATE);
INSERT INTO @tbl VALUES
('20180101','20180102','20180103')  --one max value
,('20170101','20190102','20190102'); --two max values

对于ID = 2,有两个最大值,所以我要完成的是一个带有ID列,max_date列和第三列列名称的表。因此,对于ID = 2,我想获得两列的名称(d2,d3)。

2 个答案:

答案 0 :(得分:2)

像这样尝试:

DECLARE @tbl TABLE(ID INT IDENTITY,d1 DATE, d2 DATE, d3 DATE);
INSERT INTO @tbl VALUES
 ('20180101','20180102','20180103')  --one max value
,('20170101','20190102','20190102'); --two max values

WITH cte AS
(
    SELECT TOP 1 WITH TIES
           t.ID 
          ,y.value('text()[1]','date') d
          ,y.value('local-name(.)','varchar(100)') c
    FROM @tbl t
    CROSS APPLY(SELECT d1,d2,d3 FOR XML PATH('d'),TYPE) A(x)
    CROSS APPLY x.nodes('/d/*') B(y) 
    ORDER BY DENSE_RANK() OVER(PARTITION BY ID ORDER BY y.value('text()[1]','date') DESC)
)
SELECT cte1.ID
      ,cte1.d 
      ,STUFF((SELECT ',' + cte2.c 
        FROM cte cte2 
        WHERE cte1.ID=cte2.ID
        FOR XML PATH('')),1,1,'') cs
FROM cte cte1
GROUP BY ID,d;

对于SQL Server 2017+,您最好使用STRING_AGG()

我已经添加了一些说明at the previous answer

答案 1 :(得分:0)

您可以尝试类似的代码来获取信息并将INSERT插入表中。您必须根据需要更新以下powershell -NoP -C "gc '%FileIn%'|?{$_ -notmatch '^([^|]*\|){16}N'}" >"%FileOut%" 逻辑以添加其他条件。

CASE