首页 > 解决方案 > 如何使用 SQL 选择最高和第二高字段值之间的差异?

问题描述

我有一张如下表:

id, party, constituency, votes

每个英国投票选区都有记录,数据示例是:

1, Conservative, Carlisle, 21780
2, Labour, Carlisle, 18932
3, Green, Carlisle, 2310
4, Conservative, Kensington, 22098
5, Labour, Kensington, 22056
6, Green, Kensington, 3209
7, Conservative, Islington, 32908
8, Labour, Islington, 33005
9, Green, Islington, 5409

我想确定存在最低(和最大)多数的席位。例如,我想选择给定选区的最大投票和第二名投票之间的差异小于 50 的所有字段。所以我试过:

SELECT *, 
       max.votes as max, 
       second_max.votes as max2 
FROM   election
WHERE  (max - max2) < 50  
ORDER BY votes DESC

不用说这是行不通的。请问你能帮忙吗?

标签: sqldatabasemaxminwindow-functions

解决方案


这是你想要的吗?

select *
from (
    select
        e.*,
        row_number() over(partition by constituency order by votes desc) rn
    from election e
) t
where 
    rn in (1, 2)
    and max(votes) over(partition by constituency) 
        - min(votes) over(partition by constituency) < 50

当且仅当它们之间的差异小于 50 时,此查询会为您votes提供每个2 条最高的记录。constituency

注意:只要您的 RDMBS 支持窗口函数(MySQL < 8.0 是一个明显的例外),它就可以工作。


推荐阅读