sql - 如何使用 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
不用说这是行不通的。请问你能帮忙吗?
解决方案
这是你想要的吗?
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 是一个明显的例外),它就可以工作。
推荐阅读
- java - 为什么在尝试对此图进行 DFS 以查找强连接组件时会出现 StackOverFlowError?
- c++ - 尝试在 C++ 中捕获 - 创建了多少对象
- sql - 消息 4104,级别 16,状态 1,行 30 无法绑定多部分标识符“Describe.Product_ID”
- c++ - 将参数传递给另一个可变参数函数
- angularjs - Angular Schema Form - “必需”不工作选择和复选框字段
- scala - 用于 Spark 数据帧的具有 partitionBy 的窗口函数不起作用
- python - 我如何只打印最终列表结果而不是之前的列表?
- python - 如何更改 matplotplot 标题中的背景颜色?
- php - 从数据库中获取同一页面中的结果
- jquery - 未调用 DataTables 插件来显示 Json 数据