выберите максимальное значение для каждой категории с тем же уникальным ключом - PullRequest
0 голосов
/ 06 апреля 2019

- это часть моей таблицы, я показываю ее, сортируя значение1

     uniquekey  city    test2     test3                     value1
0     001         NYC  40.724159 -73.754968                      32
1     002         NYC  40.753028 -73.921620                      22
2     003         LAX  40.845642 -73.902110                      20
3     003         LAX  40.845642 -73.902110                      19
4     002         NYC  40.753028 -73.921620                      18
5     004         LAX  40.870346 -73.904400                      17
6     005         LAX  40.849560 -73.834010                      17
7     006         LAX  40.851080 -73.848611                      17
8     002         NYC  40.753028 -73.921620                      16
9     007         NYC  40.762978 -73.831980                      16

Я ожидаю вернуть самое высокое значение1 для города Нью-Йорк Сити и самое высокое значение1 для города Лос-Анджелес.

хитрость здесь в том, что показать строки 0 и 2 непросто, потому что есть несколько строк, имеющих одинаковый уникальный ключ , т. е. для строк 1, 4, 8 в Нью-Йорке, для строк 2 и 3. LAX *.1008 *

Ожидаемый результат должен быть

    city    test2       test3                        max(value1)
0   NYC  40.724159 -73.754968                           66   <----32+18+16
1   LAX  40.845642 -73.902110                           39   <----20+19

вот мой код

query = '''
select city, test2, test3, max(value1)
from nypd
where city IN ('NYC','LAX')
group by city
order by value1 DESC
'''

он показывает только 2 верхних:

    city    test2       test3                        max(value1)
0   NYC  40.724159 -73.754968                           32
1   LAX  40.845642 -73.902110                           20

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Как насчет этого?

select n.city, n.lat, n.long, sum(n.value1)
from nypd n
where n1.uniquekey = (select max(n2.uniquekey)
                      from nypd n2
                      where n2.city = n.city
                     )
group by n.city, n.lat, n.long;
2 голосов
/ 06 апреля 2019

Сначала вам нужно агрегировать, чтобы получить сумму за комбинацию 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));
...