XQuery每天都获得最高价值

时间:2019-04-03 22:15:20

标签: xpath xquery

我正在使用XQuery进行练习,已经达到了必须获取xml文件每一天的最大值的地步。

我的文件处理的是城市全天最高温度。它多次出现在同一天,但一天中的时间却有所不同。我将为您提供一个示例,说明数据如何显示在XML文件中:

<hour>
     <date>2019-2-18</date>
     <data_hour>12:00</data_hour>
     <temperature>17</temperature>
</hour>
<hour>
     <date>2019-2-18</date>
     <data_hour>13:00</data_hour>
     <temperature>18</temperature>
</hour>
<hour>
     <date>2019-2-19</date>
     <data_hour>14:00</data_hour>
     <temperature>20</temperature>
</hour>
<hour>
    <date>2019-2-19</date>
    <data_hour>15:00</data_hour>
    <temperature>19</temperature>
</hour>

这个想法将是每天花费最多的时间,关于如何解决它的任何想法?

2 个答案:

答案 0 :(得分:1)

如果XQuery 3.0可用,则可以使用group by子句将每天的小时元素分组在一起,然后应用max函数选择最高温度。在这段代码中,我假设您已将小时元素绑定到变量$hours

for $hour in $hours
group by $date := $hour/date
return
    $date || ": " || max($hour/temperature)

根据您的源数据,这将返回两项:

"2019-2-19: 20",
"2019-2-18: 18"

我将保留它作为练习,以便您按日期对结果进行排序。在此过程中,您可能会达到日期的当前格式的限制,因此您需要将日期转换为符合xs:date数据类型的值,该数据类型可以可靠地排序。

如果您仅限使用XQuery 1.0,请参阅XQuery 3.0 equivalent group by in xquery 1.0 version

答案 1 :(得分:0)

尝试一下,像我添加的一样添加其他父标签

let $body := doc("1.xml")
for $i in distinct-values($body//hour/date)
    return <Day value = "{data($i)}"> {
        let $hours := (for $row in $body//hour
            for $j in $row/date where xs:string(data($j)) = xs:string(data($i))
                return fn:substring($row/data_hour, 1, 2))
        return fn:max($hours)
        }
    </Day>

如果还考虑了分钟,请告诉我。