我有一个具有以下结构的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()
。
答案 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;