SQL查询需求:筛选无更高金额关联的配对行
需求:筛选满足条件的记录
需要筛选出符合以下条件的行:该行的Origen(Column A)和Destino(Column B)组成的关联对(包括反向配对,比如Origen=A、Destino=B和Origen=B、Destino=A属于同一关联组)中,不存在金额(Dinero/€)更高的条目。
示例数据
| Column A | Column B | € |
|---|---|---|
| A | B | 100 |
| B | A | 100 |
| C | B | 80 |
| B | C | 80 |
| D | E | 75 |
| E | D | 75 |
期望输出
由于B和A的配对金额(100)高于B和C的配对金额(80),因此C与B的配对行被排除:
| Column A | Column B | € |
|---|---|---|
| A | B | 100 |
| B | A | 100 |
| D | E | 75 |
| E | D | 75 |
尝试过的方法
我尝试使用rank() over (partition by...order by ...)窗口函数,但未得到预期结果。
真实业务数据(标注“ok”的为符合条件的行)
Origen --- Destino --- Dinero 2 -------- 13 ------- 822205 € ok 13 -------- 2 ------- 822205 € ok 32 -------- 13 ------- 794909 € 13 -------- 32 ------- 794909 € 27 -------- 32 ------- 774035 € ok 32 -------- 27 ------- 774035 € ok 2 -------- 32 ------- 740558 € 32 -------- 2 ------- 740558 € 30 -------- 13 ------- 717471 € 13 -------- 30 ------- 717471 € 27 -------- 13 ------- 703739 € 13 -------- 27 ------- 703739 € 17 -------- 13 ------- 695366 € 13 -------- 17 ------- 695366 € 30 -------- 27 ------- 694234 € 27 -------- 30 ------- 694234 € 2 -------- 27 ------- 686425 € 27 -------- 2 ------- 686425 € 17 -------- 30 ------- 663328 € ok 30 -------- 17 ------- 663328 € ok
解决方案
核心思路是:先将每个Origen-Destino配对转化为无序的关联组(比如把Origen和Destino按大小排序,生成统一的组标识),再计算每个组的最大金额,最后只保留金额等于对应组最大金额的行。
SQL代码示例
WITH grouped_data AS ( SELECT Origen, Destino, Dinero, -- 生成无序组标识:确保A-B和B-A属于同一组 CONCAT(LEAST(Origen, Destino), '-', GREATEST(Origen, Destino)) AS group_id, -- 计算每个组的最大金额 MAX(Dinero) OVER (PARTITION BY CONCAT(LEAST(Origen, Destino), '-', GREATEST(Origen, Destino))) AS max_group_amount FROM your_table_name ) SELECT Origen, Destino, Dinero FROM grouped_data WHERE Dinero = max_group_amount;
代码说明
- 生成无序组标识:用
LEAST()和GREATEST()函数将Origen和Destino按升序拼接,让反向配对归为同一组。 - 计算组内最大金额:通过窗口函数
MAX(Dinero) OVER (PARTITION BY group_id)获取每个组的最高金额。 - 筛选目标行:保留金额等于对应组最大金额的记录,自动排除组内存在更高金额的配对行。
内容的提问来源于stack exchange,提问作者Caminerin
相关产品推荐
相关产品推荐

