首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取一行中的最高值以及列名

如何获取一行中的最高值以及列名
EN

Stack Overflow用户
提问于 2018-08-01 20:36:02
回答 1查看 68关注 0票数 0

我有一个包含10列的表,其中8列包含日期。我想要的结果是获得每一行的最大日期(我已经完成了这一点),但我还希望获得列的名称,这个最大日期来自这些列。

    SELECT s.sp_id
,s.sp_numer
,(
    SELECT MAX(Data_przedawnienia_update)
    FROM (
        VALUES (Data_przedawnienia_Postanowienie_o_umorzeniu_egzekucji)
            ,(Data_przedawnienia_Egzekucja_w_toku)
            ,(Data_przedawnienia_Nakaz_zaplaty_z_klauzula)
            ,(Data_przedawnienia_Nakaz_zaplaty)
            ,(Data_przedawnienia_Sprawa_sadowa_w_toku)
            ,(Data_przedawnienia_Wplaty_na_etapie_polubownym)
            ,(Data_przedawnienia_Umowa_ugody)
            ,(Data_przedawnienia_Wypowiedzenie_umowy)
        ) AS Data_przedawnienia(Data_przedawnienia_update)
    ) AS Data_przedawnienia_update
FROM dm_data_bps.dbo.sprawa AS s
INNER JOIN dm_data_bps.dbo.cache_sprawa_info AS csi ON s.sp_id = csi.sp_id
AND sprawa_zamknieta = 0
LEFT JOIN ##Postanowienie_o_umorzeniu_egzekucji AS umorzenie ON s.sp_id =       
umorzenie.sp_id
LEFT JOIN ##Egzekucja_w_toku AS egzekucja ON s.sp_id = egzekucja.sp_id
LEFT JOIN ##Nakaz_zaplaty_z_klauzula AS nakaz_kl ON s.sp_id = nakaz_kl.sp_id
LEFT JOIN ##Nakaz_zaplaty AS nakaz ON s.sp_id = nakaz.sp_id
LEFT JOIN ##Sprawa_sadowa_w_toku AS sprawa_sad ON s.sp_id = sprawa_sad.sp_id
LEFT JOIN ##Wplaty_na_etapie_polubownym AS wplaty_polubowny ON s.sp_id =   
wplaty_polubowny.sp_id
LEFT JOIN ##Umowa_ugody AS ugoda ON s.sp_id = ugoda.sp_id
LEFT JOIN ##Wypowiedzenie_umowy AS wypowiedzenie ON s.sp_id = 
wypowiedzenie.sp_id
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 21:00:40

XML具有强大的处理通用查询的能力:

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

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);

更新:一些解释

第一个CROSS APPLY将创建如下所示的XML:

<d>
  <d1>2018-01-01</d1>
  <d2>2018-01-02</d2>
  <d3>2018-01-03</d3>
</d>

第二个CROSS APPLY使用.nodes()返回<d>中的所有节点。使用.value(),我们可以获得元素的名称(local-name())及其内容。

DENSE_RANKTOP 1 WITH TIES的诀窍是返回所有获得1 (每个ID最高的行)的行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51633476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档