XQuery получает самое высокое значение каждый день - PullRequest
0 голосов
/ 04 апреля 2019

Я практикуюсь с 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 ]

1 голос
/ 04 апреля 2019

Если доступен 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 в версии xquery 1.0 .

0 голосов
/ 04 апреля 2019

Попробуйте, добавьте дополнительный родительский тег, как я добавил

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>

Скажите, учитываются ли минуты.

...