- From: Dave Beckett <dave@dajobe.org>
- Date: Fri, 23 Mar 2012 21:35:18 -0700
- To: public-rdf-dawg-comments@w3.org
The test uses: ==> agg-err-02.ttl <== @prefix : <http://example.com/data/#> . :x :p 1, "2", 3, 4 . :y :p 1, _:b2, 3, 4 . :z :p 2.5e0, "not a double" , 3.5, 4 . ==> agg-err-02.rq <== PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX : <http://example.com/data/#> SELECT ?g (AVG(IF(isNumeric(?p), ?p, COALESCE(xsd:double(?p),0))) AS ?avg) WHERE { ?g :p ?p . } GROUP BY ?g Lets work this through First grouping by subject and I added the XSD types in []s x group: 1 [integer], "2" [string], 3 [integer], 4 [integer] y group: 1 [integer], _:b2 [bnode], 3 [integer], 4 [integer] z group: 2.5e0 [double], "not a double", 3.5 [decimal], 4 [integer] so now evaluate the isNumeric. The second values are replaced by xsd:double(?p) or 0 [integer] if that fails x group: 1 [integer], 2.0E0 [double], 3 [integer], 4 [integer] y group: 1 [integer], 0 [integer], 3 [integer], 4 [integer] z group: 2.5e0 [double], 0 [integer], 3.5 [decimal], 4 [integer] Now the averages, type promoting based on the + operator then / operator x group: ( 1 [integer] + 2.0E0 [double] + 3 [integer] + 4 [integer] ) / 4 [integer] = 10E0 [double] / 4 [integer] = 2.5E0 [double] y group: ( 1 [integer], 0 [integer], 3 [integer], 4 [integer] ) / 4 [integer] = 10 [integer] / 4 [integer] and by XSD int/int division rule the result is always decimal = 2.5 [decimal] z group: ( 2.5e0 [double], 0 [integer], 3.5 [decimal], 4 [integer] ) / 4 [integer] = 10.0 [ decimal ] / 4 [integer] = 2.5 [decimal] Results: g avg ----- x 2.5E0 [double] y 2.0 [decimal] z 2.5 [decimal] Expected results: g avg ----- x 2.5e0 [double] y 2.0 [decimal] z 2.5E0 [double] The z result doesn't match the types but they are equal values - is that good enough or did I go wrong somewhere? Are there different type conversion rules for AVG and aggregate ops? Dave
Received on Saturday, 24 March 2012 04:35:44 UTC