XQuery - укажите название и население самой густонаселенной страны на каждом континенте - PullRequest
0 голосов
/ 03 мая 2020

Мне нужно выполнить следующее упражнение, но я не знаю, как это сделать.

Укажите название и население самой густонаселенной страны на каждом континенте. Запрещено использовать идентификаторы 5 континентов в запросе, ie ни «f0_119», ни «f0_123», ни «f0_126», ни «f0_129», ни «f0_132» не могут появляться в запросе.

Здесь у вас есть ссылка для загрузки файла XML: https://drive.google.com/file/d/1a_YYqW-uWYtGNBuMqqAiMu4vElGJbYCx/view?usp=sharing

Это мой код. У меня есть Китай, но мне нужно показать самые густонаселенные страны других континентов: Россию, Соединенные Штаты ... Кто-нибудь может мне помочь, пожалуйста?

for $var in /mondial/country
let $max:= max(/mondial/country/@population)
where $var/@population = $max
return concat(data($var/name), ' - ',data($var/@population))

1 Ответ

0 голосов
/ 04 мая 2020

@ pepe123656, вы не указали, какую версию XQuery вы используете. Вот решение XQuery 3.0 и новее, в котором используется условие group by. Предикат

encompassed[...] используется, поскольку некоторые страны, такие как Россия, Турция и т. П., Находятся на двух континентах.

XQuery

<root>{
    for $country in doc('e:\temp\mon.xml')/mondial/country
    let $population := $country/@population
    (: Turkey, Russia, etc. are on two continents :)
    (: We select the highest land percentage continent :)
    group by $continentID := $country/encompassed[xs:double(@percentage) eq max($country/encompassed/@percentage)]/@continent
    order by $continentID
    return <row>
      {
        $country/../continent[@id = $continentID]/@name || ": " || $country[@population = max($population)]/@name || ": " || xs:integer(max($population))
      }
      </row>
}</root>

Выход

<root>
  <row>Europe: Germany: 83536112</row>
  <row>Asia: China: 1210004992</row>
  <row>America: United States: 266476272</row>
  <row>Australia/Oceania: Australia: 18260864</row>
  <row>Africa: Nigeria: 103912488</row>
</root>
...