Oracle sql从同一个表

时间:2016-06-22 12:04:20

标签: sql oracle oracle11g

我有一张包含超过4千万条数据的表格。问题是某些列是NULL,我必须根据某些规则从同一个表中填充这些NULL值。

示例 - 表格有四列:nametelephoneemailcity  以及如下数据:

name    telephone   email          city
test    123                        delhi
test    123         xyz@test.com    

然后,由于上述行中的姓名和电话相同,我们可以使用来自第二行的数据和第一行中的第二行中的类似城市来填充第一行中的电子邮件。我听说过first_value函数,但运行速度很慢。有替代品吗?

1 个答案:

答案 0 :(得分:0)

正如您所提到的,最简单的方法是使用FIRST_VALUE()

SELECT name,
       telephone,
       FIRST_VALUE( email ) IGNORE NULLS
                            OVER ( PARTITION BY name, telephone ) AS email,
       FIRST_VALUE( city  ) IGNORE NULLS
                            OVER ( PARTITION BY name, telephone ) AS city
FROM   table_name;

您也可以将FIRST_VALUE替换为MINMAX

或者您可以使用LAG()LEAD()执行类似的操作:

SELECT name,
       telephone,
       COALESCE(
         email,
         LAG( email )  IGNORE NULLS
                       OVER ( PARTITION BY name, telephone
                              ORDER BY ROWNUM ),
         LEAD( email ) IGNORE NULLS
                       OVER ( PARTITION BY name, telephone
                              ORDER BY ROWNUM )
       ) AS email,
       COALESCE(
         email,
         LAG( city  ) IGNORE NULLS
                      OVER ( PARTITION BY name, telephone
                             ORDER BY ROWNUM ),
         LEAD( city ) IGNORE NULLS
                      OVER ( PARTITION BY name, telephone
                             ORDER BY ROWNUM )
       ) AS city
FROM   table_name;