用其他表中的值替换表中的空值

问题描述 投票:0回答:1

这里有两张表:

表_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
  • 中具有 NULL 值的名称
  • 看看这些名字是否出现在
    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

我该如何纠正?

db2
1个回答
0
投票

您显示的语句无法产生显示的输出。 您必须更改 b_filtered CTE 中的“GROUP BY b.name” 到

 GROUP BY b.name, b.var

它将产生所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.