XQuery: возвращение наибольшего значения после заказа - PullRequest
0 голосов
/ 12 апреля 2020

Я все еще новичок в XQuery, но я почти вычислил этот запрос, но он должен просто вернуть proteinID и numberOfAuthors элемента большинству авторов, однако в настоящее время он возвращает все их, а не просто элемент с наибольшим числом авторов.

Мой запрос

for $i in doc("test.xml")/ProteinDatabase/ProteinEntry
let $author-count := count($i/reference/refinfo/authors)
let $proteinID := $i/@id
where $author-count = max($author-count)
order by $author-count descending
return ((<proteinID>{data($proteinID)}</proteinID>,
<numberOfAuthors>{data($author-count)}</numberOfAuthors>))

, который возвращает:

<proteinID>QRHUA4</proteinID>
<numberOfAuthors>47</numberOfAuthors>
<proteinID>PLHU</proteinID>
<numberOfAuthors>29</numberOfAuthors>
<proteinID>LPHUB</proteinID>
<numberOfAuthors>29</numberOfAuthors>

и т. д.

Что Я просто хочу вернуть это первый proteinID и самый высокий, который равен 47, как показано ниже:

<proteinID>QRHUA4</proteinID>
<numberOfAuthors>47</numberOfAuthors>

Я пробовал несколько вещей, например, мое утверждение where, которое там есть

where $author-count = max($author-count)

но, похоже, он на самом деле ничего не сделал. Я также попробовал некоторые позиционные вещи и выбрал только первый индекс, но, похоже, он возвращает только идентификатор QRHUA4, но не числоOfAuthors

Ответы [ 2 ]

1 голос
/ 12 апреля 2020
for $i in //ProteinEntry[reference/refinfo/authors/count(*) = 
                         max(//ProteinEntry/reference/refinfo/authors/count(*))
                        ]
let $author-count := count($i/reference/refinfo/authors/author)
let $proteinID := $i/@id
return ((<proteinID>{$proteinID}</proteinID>,
<numberOfAuthors>{$author-count}</numberOfAuthors>))

скрипка: https://xqueryfiddle.liberty-development.net/jyH9Xv4/1

1 голос
/ 12 апреля 2020

Ну, вы можете просто выбрать первый элемент в последовательности результатов, используя

(for $i in doc("proteindb.xml")/ProteinDatabase/ProteinEntry
let $author-count := count($i/reference/refinfo/authors)
let $proteinID := $i/@id
where $author-count = max($author-count)
order by $author-count descending
return ((<proteinID>{data($proteinID)}</proteinID>,
<numberOfAuthors>{data($author-count)}</numberOfAuthors>)))[1]

или

head(for $i in doc("proteindb.xml")/ProteinDatabase/ProteinEntry
let $author-count := count($i/reference/refinfo/authors)
let $proteinID := $i/@id
where $author-count = max($author-count)
order by $author-count descending
return ((<proteinID>{data($proteinID)}</proteinID>,
<numberOfAuthors>{data($author-count)}</numberOfAuthors>)))
...