我想获取人口最多和最少的州的人口。我知道如何使用ORDER BY(ASC和DESC)。如何将这两个 (ASC和DESC) 组合在一个查询中?
SELECT ?population
{
?state rdf:type :State
?state :hasPopulation ?population.
} ORDER BY DESC(?population) LIMIT 1
AND
SELECT ?population
{
?state rdf:type :State
?state :hasPopulation ?population.
} ORDER BY ASC(?population) LIMIT 1
Run Code Online (Sandbox Code Playgroud)
SELECT ?population_max ?population_min {
?state_max rdf:type :State .
?state_max :hasPopulation ?population_max .
?state_min rdf:type :State .
?state_min :hasPopulation ?population_min .
} ORDER BY DESC(?population_max) ASC(?population_min) LIMIT 1
Run Code Online (Sandbox Code Playgroud)
也许更有效:
SELECT * {
{
SELECT (?population AS ?population_max) {
?state rdf:type :State .
?state :hasPopulation ?population .
} ORDER BY DESC(?population) LIMIT 1
}
{
SELECT (?population AS ?population_min) {
?state rdf:type :State .
?state :hasPopulation ?population .
} ORDER BY ASC(?population) LIMIT 1
}
}
Run Code Online (Sandbox Code Playgroud)
使用 AnzoGraph 或 Blazegraph,在这种情况下可以使用命名 子查询:
SELECT *
WITH {
SELECT ?pop { [] a :State ; :hasPopulation ?pop }
} AS %unsorted
WHERE {
{ SELECT (?pop AS ?max) { INCLUDE %unsorted } ORDER BY DESC(?pop) LIMIT 1 }
{ SELECT (?pop AS ?min) { INCLUDE %unsorted } ORDER BY ASC(?pop) LIMIT 1 }
}
Run Code Online (Sandbox Code Playgroud)
最后,而不是重写而不是组合:
SELECT (MAX(?population) AS ?population_max) (MIN(?population) AS ?population_min) {
?state rdf:type :State .
?state :hasPopulation ?population
}
Run Code Online (Sandbox Code Playgroud)
如果使用聚合...但未
GROUP BY使用该术语,则将其视为所有解决方案所属的单个隐式组。