【发布时间】:2015-09-02 09:22:35
【问题描述】:
我有一个具有这种结构的 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()。
【问题讨论】:
-
尝试先从 XML 读取数据,然后进行分组
WITH cte AS (SELECT * FROM @xml) SELECT * FROM cte GROUP BY ...
标签: sql sql-server xml