[xquery-talk] find most occurring incidence
Christian Grün
christian.gruen at gmail.com
Tue Apr 26 03:35:34 PDT 2016
And two another solutions, taking advantage of maps:
The more readable one:
let $map := map:merge(
for $color in //color
group by $value := $color
return map { $value: count($color) }
)
let $max := max($map?*)
return map:for-each($map, function($color, $value) {
if($value eq $max) then $color else ()
})
The more cryptical (and not that efficient) one:
let $m := map:merge(
for $v in distinct-values(//color)
return map { $v: count(//color[. eq $v]) }
)
return map:keys($m)[$m(.) = max($m?*)]
On Tue, Apr 26, 2016 at 12:17 PM, Christian Grün
<christian.gruen at gmail.com> wrote:
> Hi Leo,
>
> here’s one more solution. It is not much shorter than yours, but may
> be a bit more readable:
>
> let $cols :=
> for $colors in //color
> group by $value := $colors/data()
> return <color count="{ count($colors) }" value="{ $value }"/>
> let $max := max($cols/@count)
> return $cols[@count = $max]/@value/data()
>
> I think that in every case the values need to be accessed at least
> twice, because we’ll first need to find out what is the actual maximum
> count, and then need to look for all values matching that maximum.
>
> Hope this helps,
> Christian
>
>
>
> On Tue, Apr 26, 2016 at 12:02 PM, Leo Studer <leo.studer at varioweb.ch> wrote:
>> Hello Cracks ;-)
>>
>> I need to find the most occurring incidence, lets say the color that occurs
>> most out of
>>
>> <colors>
>> <color>red</color>
>> <color>green</color>
>> <color>blue</color>
>> <color>red</color>
>> <color>green</color>
>> <color>green</color>
>> <color>red</color>
>> <color>blue</color>
>> <!-- .... -->
>> </colors>
>>
>>
>> Here my first solution
>>
>> (for $color in distinct-values(//color)
>> order by count(//color[. eq $color]) descending
>> return $color)[1]
>>
>> Problem: red and green have both 3 occurrences.
>>
>> This works but looks horrible
>>
>> for $max in max(for $color in distinct-values(//color) return
>> count(//color[. eq $color])),
>> $color in distinct-values(//color)
>> return
>> if (count(//color[. eq $color]) eq $max) then $color else ()
>>
>>
>> Any better suggestions?
>>
>> Thanks in advance
>> Leo
>>
>> _______________________________________________
>> talk at x-query.com
>> http://x-query.com/mailman/listinfo/talk
More information about the talk
mailing list