【问题标题】:XQuery get the highest value every dayXQuery 每天获取最高值
【发布时间】:2019-08-25 13:41:34
【问题描述】:

我正在使用 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>

这个想法是把每天最多的时间拿出来,你知道如何解决它吗?

【问题讨论】:

  • xml 无效。

标签: xpath xquery


【解决方案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

【讨论】:

    【解决方案2】:

    试试这个,像我添加的那样添加一个额外的父标签

    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>
    

    告诉我是否也考虑分钟数。

    【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2020-08-22
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多