我有一个包含10列的表格,其中有八列是带有日期的列。我期望的结果是获取每一行的最大日期(我已经完成的工作),但我也想获取最大日期来自的列的名称。
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
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:
CROSS APPLY
<d> <d1>2018-01-01</d1> <d2>2018-01-02</d2> <d3>2018-01-03</d3> </d>
第二个CROSS APPLY用于.nodes()返回中的所有节点<d>。通过.value()我们可以获得元素的名称(local-name())及其内容。
.nodes()
<d>
.value()
local-name()
有诀窍DENSE_RANK,并TOP 1 WITH TIES返回其获得的所有行1(这是每个ID最高)。
DENSE_RANK
TOP 1 WITH TIES
1