Сначала вам нужно агрегировать, чтобы получить сумму за комбинацию uniquekey
, city
, test2
и test3
.
Затем, чтобы получить те, которые имеют наибольшую сумму на город, который вы могли быфильтр для оконной функции row_number()
с разбивкой по городам и упорядочением по убыванию суммы 1
.
SELECT city,
test2,
test3,
value1
FROM (SELECT city,
test2,
test3,
sum(value1) value1,
row_number() OVER (PARTITION BY city
ORDER BY sum(value1) DESC) rn
FROM nypd
WHERE city IN ('NYC', 'LAX')
GROUP BY uniquekey,
city,
test2,
test3) x
WHERE rn = 1;
Однако более старые версии SQLite до 3.25.0 не поддерживают row_number()
.Здесь вы можете использовать EXISTS
и коррелированный подзапрос, проверяя наличие сумм, превышающих текущую сумму, или, в случае привязки, проверять, чтобы uniquekey
другой строки было больше.Агрегирование может быть помещено в CTE, поэтому его не нужно повторять в подзапросе.
WITH cte
AS
(
SELECT uniquekey,
city,
test2,
test3,
sum(value1) value1
FROM nypd
WHERE city IN ('NYC', 'LAX')
GROUP BY uniquekey,
city,
test2,
test3
)
SELECT c1.city,
c1.test2,
c1.test3,
c1.value1
FROM cte c1
WHERE NOT EXISTS (SELECT *
FROM cte c2
WHERE c2.city = c1.city
AND (c2.value1 > c1.value1
OR c2.value1 = c1.value1
AND c2.uniquekey > c1.uniquekey));