如何基于列值比较从指定列提取对应值(SQL实现)
问题描述
我有一张结构如下的表:
| PartRef | Part | Date |
|---|---|---|
| 123401 | 123401 | 22072024 |
| 123401 | 123402 | 24072024 |
| 234501 | 234501 | 20062024 |
| 345601 | 345601 | 10052024 |
需求是:检查PartRef列的值是否存在于Part列中,然后将对应的Date值提取到新列RelDate中。例如当PartRef=123401时,两行的RelDate都应为22072024。
预期结果如下:
| PartRef | Part | Date | RelDate |
|---|---|---|---|
| 123401 | 123401 | 22072024 | 22072024 |
| 123401 | 123402 | 24072024 | 22072024 |
| 234501 | 234501 | 20062024 | 20062024 |
| 345601 | 345601 | 10052024 | 10052024 |
我尝试过子查询、EXIST和IN,但无法获取特定行的正确日期,该如何实现?
解决方案
方法1:自连接(Self Join)
将表与自身关联,匹配PartRef和Part相等的行,直接获取对应的基准日期:
SELECT t1.PartRef, t1.Part, t1.Date, t2.Date AS RelDate FROM your_table t1 INNER JOIN your_table t2 ON t1.PartRef = t2.Part;
方法2:窗口函数(Window Function)
如果每个PartRef仅对应一条Part匹配记录(如示例场景),用窗口函数分组提取更简洁:
SELECT PartRef, Part, Date, MAX(CASE WHEN PartRef = Part THEN Date END) OVER (PARTITION BY PartRef) AS RelDate FROM your_table;
补充说明
- 自连接方式适用于
PartRef对应多个Part匹配的场景,若存在多条匹配,可通过MIN()/MAX()聚合函数筛选目标日期; - 窗口函数方式无需关联表,直接通过分组逻辑提取基准日期,性能更优且代码简洁。
内容的提问来源于stack exchange,提问作者jagdfuerst
相关产品推荐
相关产品推荐

