我有一个非常具体的问题,我希望有人能解释一下。这不完全是一个错误,但对我需要运行以返回所需结果集的查询有更多帮助。
我有一个名为 xml_table 的表,有 2 列;word_id,word_data:
word_id | word_data
1 | <results><channel id="1"><r s="0" d="650" w="Hello"/><r s="650" d="230" w="SIL"/></channel></results>
2 | <results><channel id="1"><r s="0" d="350" w="Sorry"/><r s="350" d="10" w="WHO"/></channel></results>
3 | <results><channel id="1"><r s="0" d="750" w="Please"/><r s="750" d="50" w="s"/></channel></results>
...
依此类推,其中 word_data 是一个 XML 字符串。
每行中的 XML 字符串格式如下:
<results>
<channel id="1">
<r s="0" d="100" w="SIL"/>
<r s="100" d="250" w="Sorry"/>
<r s="350" d="100" w="WHO"/>
<r s="450" d="350" w="SIL"/>
<r s="800" d="550" w="SIL"/>
<r s="1350" d="100" w="Hello"/>
<r s="1450" d="200" w="s"/>
<r s="1650" d="50" w="SIL"/>
<r s="1700" d="100" w="SIL"/>
</channel>
</results>
s 表示开始时间
d 表示持续时间
w 表示单词
(r 标记的数量不固定,并且在 xml_table 的行与行之间变化)
现在的想法是筛选每一行,并在每个 XML 中,计算当 'SIL' 或 's' 在 w 属性中作为 a 出现时的最长连续持续时间,然后在新表中将其作为最长暂停(即最长连续的 SIL/s 持续时间)也带有 word_id 和 word_data。
因此,在上面的示例 xml 中,我们有三个连续的周期,其中最长的暂停可以发生,其中总持续时间为 100 (100)、900 (350+550) 和 350 (200 + 50 + 100),因此最长的暂停是 900,所以 900 会被退回。
我想知道是否有人可以提供帮助,到目前为止我有:
DECLARE @xml XML
DECLARE @ordered_table TABLE (id VARCHAR(20) NOT NULL, start_time INT NOT NULL, duration INT NOT NULL, word VARCHAR(50) NOT NULL)
SELECT @xml = (SELECT word_data FROM xml_table where word_id = 1)
INSERT into @ordered_table_by_time(id, start_time, duration, word)
SELECT 'NAME' AS id, Tbl.Col.value('@s', 'INT'), Tbl.Col.value('@d', 'INT'), Tbl.Col.value('@w', 'varchar(50)') FROM @xml.nodes('/results/channel[@id="1"]/r') Tbl(Col)
即,我创建了一个表来放入 XML,但我不知道从那里去哪里,
请问有人可以帮忙吗?
谢谢 :)