这里有两张表:
表_a:
name year var
---------------
john 2010 a
john 2011 a
john 2012 c
alex 2020 b
alex 2021 c
tim 2015 NULL
tim 2016 NULL
joe 2010 NULL
joe 2011 NULL
jessica 2000 NULL
jessica 2001 NULL
表_b
name year var
--------------
sara 2001 a
sara 2002 b
tim 2005 c
tim 2006 d
tim 2021 f
jessica 2020 z
这就是我想要实现的目标:
table_a
table_b
table_a
) 在 table_b
中是否有一行,其年份 (table_b
) 出现在 table_a
table_a
中的 NULL 替换为最接近最早年份 (table_b
) 的 var (table_a
) 值我试过这个:
WITH min_year AS (
SELECT name, MIN(year) as min_year
FROM table_a
GROUP BY name
),
b_filtered AS (
SELECT b.name, MAX(b.year) as year, b.var
FROM table_b b
INNER JOIN min_year m ON b.name = m.name AND b.year < m.min_year
GROUP BY b.name
)
SELECT a.name, a.year,
CASE
WHEN a.var IS NULL AND b.name IS NOT NULL THEN b.var
ELSE a.var
END as var_mod
FROM table_a a
LEFT JOIN b_filtered b
ON a.name = b.name;
但是我得到了错误的输出:
name year var_mod
john 2010 a
john 2011 a
john 2012 c
alex 2020 b
alex 2021 c
tim 2015 NULL
tim 2016 NULL
joe 2010 NULL
joe 2011 NULL
jessica 2000 NULL
jessica 2001 NULL
正确的输出应该是:
name year var_mod
john 2010 a
john 2011 a
john 2012 c
alex 2020 b
alex 2021 c
tim 2015 d
tim 2016 d
joe 2010 NULL
joe 2011 NULL
jessica 2000 NULL
jessica 2001 NULL
我该如何纠正?
您显示的语句无法产生显示的输出。 您必须更改 b_filtered CTE 中的“GROUP BY b.name” 到
GROUP BY b.name, b.var
它将产生所需的输出。