如何使用SQL LAG函数获取Red名称对应的上一条Blue记录的值?
解决方案
可以实现,但单纯使用LAG()函数无法直接满足需求,需要结合条件判断与窗口函数的范围设置来定位目标记录。
具体SQL语句(兼容多数主流数据库)
SELECT ID, Name, Color, Value, LAST_VALUE(CASE WHEN Color = 'Blue' THEN Value END) OVER ( PARTITION BY Name ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING IGNORE NULLS ) AS PreviousValue FROM Data WHERE Color = 'Red' ORDER BY ID;
语句说明
- 筛选目标记录:通过
WHERE Color = 'Red'仅保留颜色为Red的行。 - 分组排序:
PARTITION BY Name按Name分组,ORDER BY ID确保每个分组内按ID升序排列。 - 捕获最近的Blue值:
CASE WHEN Color = 'Blue' THEN Value END:仅标记颜色为Blue的Value,其他行返回NULL。LAST_VALUE(...) OVER (...):在当前行之前的所有历史行(ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)中,取最后一个非NULL的标记值(IGNORE NULLS),也就是同Name下最近的Blue记录的Value。- 如果当前Red记录之前没有同Name的Blue记录,则返回NULL,完全匹配期望结果。
执行结果
| ID | Name | Color | Value | PreviousValue |
|---|---|---|---|---|
| 2 | B | Red | 2 | NULL |
| 4 | B | Red | 4 | NULL |
| 6 | A | Red | 4 | 3 |
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

