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 valuesSELECt TOP 1 WITH TIES t.ID ,y.value('text()[1]','date') d ,y.value('local-name(.)','varchar(100)') cFROM @tbl tCROSS 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_RANK,并
TOP 1 WITH TIES返回其获得的所有行
1(这是每个ID最高)。



