#neo4j #cypher #union #correlated-subquery
#neo4j #шифр #объединение #коррелированный подзапрос
Вопрос:
Мне нужно ответить на следующий запрос: три лучших города-магазина на основе продаж в магазинах и продаж в магазинах для всех остальных городов вместе взятых.
Со следующим запросом
// Top 3 cities
MATCH (t:Store)<-[:HasStore]-(s:Sales)
WITH t.StoreCity AS StoreCity, t, sum(s.StoreSales) AS StoreSales
ORDER BY sum(s.StoreSales) DESC LIMIT 3
// All other cities
WITH StoreCity, StoreSales, collect(t) AS TopThreeCities
MATCH (t1:Store)<-[:HasStore]-(s:Sales)
WHERE NOT(t1 IN TopThreeCities)
// JOIN of the two results -> I would need the UNION
RETURN StoreCity, StoreSales, "Other cities" AS StoreCity1, sum(s.StoreSales) AS StoreSales1
Я смог получить следующий ответ
"A" 10 "Other Cities" 50
"B" 9 "Other Cities" 50
"C" 8 "Other Cities" 50
Но я хотел бы получить
"A" 10
"B" 9
"C" 8
"Other Cities" 50
Есть идеи, как это получить? Я перепробовал много возможностей без какого-либо успеха 🙁
Ответ №1:
Использование ОБЪЕДИНЕНИЯ:
// Top 3 cities
MATCH (t:Store)<-[:HasStore]-(s:Sales)
RETURN t.StoreCity AS StoreCity, sum(s.StoreSales) AS StoreSales
ORDER BY sum(s.StoreSales) DESC LIMIT 3
// All other cities
UNION
MATCH (t:Store)<-[:HasStore]-(s:Sales)
WITH t.StoreCity, sum(s.StoreSales) AS AllStoreSales
ORDER BY AllStoreSales DESC SKIP 3
RETURN "Other cities" AS StoreCity, sum(AllStoreSales) AS StoreSales
ОБЪЕДИНЕНИЕ выполняет два разных запроса, поэтому перед ОБЪЕДИНЕНИЕМ мы находим три самых продаваемых города и возвращаем их имена и количество, как вы и предполагали изначально
После ОБЪЕДИНЕНИЯ снова выполняется тот же базовый запрос, чтобы найти сумму продаж по городам, упорядоченную по убыванию продаж, затем три лучших результата пропускаются. Продажи оставшегося города суммируются и возвращаются как другие города.
Две части ОБЪЕДИНЕНИЯ полностью разделены, но оба запроса должны возвращать одинаковое количество столбцов с одинаковыми именами столбцов и в одинаковом порядке столбцов.