使用T-SQL对XML文档进行聚合查询

时间:2015-09-02 09:22:36

标签: sql sql-server xml

我有一个具有以下结构的XML文件:

<row>
    <id><timestamp>
    <some other fields>
 </row>
 <row>
    <id><timestamp>
    <some other fields>
 </row>

多行具有相同的id但时间戳不同。

我想编写一个查询,将XML的内容提取到SQL行集中,这样对于每个id,我将获得具有最新时间戳的行。

到目前为止,感谢这个SO question,我必须使用以下方法提取行:

SELECT T2.Row.query('.')
FROM   #xml_tmp_table
CROSS APPLY XML_TABLE.nodes('/xml_ROOT/section_of_interest') as T2(Row) 

现在,根据SQL文档,可以通过value()方法从XML行读取单列数据。

所以我想做这样的事情:

SELECT 
   T2.Row.query('.').value("id_field", "int"),
   max( T2.Row.query('.').value("timestamp_field", "datetime")),
   T2.Row.query('.').value("data_field_1", "decimal(5,2)")),
   T2.Row.query('.').value("data_field_2", "int")),
   ...
   T2.Row.query('.').value("yet_another_data_field", "its_type"))
FROM #xml_tmp_table --or T2 maybe?
group by id_field

因此,我只会获得每id个值最新时间戳的行。

是否有正确的方法来完成此任务?

猜猜我必须将第一个查询的结果保存到临时表中并在其行上应用value()

1 个答案:

答案 0 :(得分:3)

在派生表中提取您的值,并在主查询中执行分组。

select T.id,
       max(T.timestamp) as timestamp
from (
     select R.X.value('(id/text())[1]', 'int') as id,
            R.X.value('(timestamp/text())[1]', 'datetime') as timestamp
     from dbo.YourTable as T
       cross apply T.X.nodes('/root/row') as R(X)
    ) as T
group by T.id;

SQL Fiddle