【问题标题】:Aggregation query over XML document using T-SQL使用 T-SQL 对 XML 文档进行聚合查询
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • @Zack,如果答案对您有用,请将其单击为“已接受”。每个人都会看到,问题已解决,Mikael Erikson 对声誉积分感到高兴:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多