使用相同的唯一键为每个类别选择最大值

时间:2019-04-05 23:57:00

标签: sql sqlite max

这是表的一部分,我通过对value1进行排序来显示

     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行不是一个容易的问题,因为有几行具有相同的唯一键,即对于NYC行1、4、8,对于LAX行2和3。

预期输出应为

    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 个答案:

答案 0 :(得分:2)

您首先需要进行汇总,以获取A B C D E F G H 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 9 1 2 3 4 5 6 7 10 1 2 3 4 5 6 7 11 1 2 3 4 5 6 7 12 1 2 3 4 5 6 7 13 uniquekeycitytest2组合的总和。

然后,要获得每个城市的总和最高的货币,可以过滤test3窗口函数,按城市划分,并以总和降序为row_number()进行排序。

1

但是,SQLite 3.25.0之前的旧版本不支持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; 。在这里,您可以使用row_number()和相关子查询来检查是否存在大于当前总和的总和,或者在出现平局的情况下,检查另一行的EXISTS是否更大。聚合可以放在CTE中,因此不需要在子查询中重复进行。

uniquekey

答案 1 :(得分:2)

怎么样?

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;