我有一张包含超过4千万条数据的表格。问题是某些列是NULL
,我必须根据某些规则从同一个表中填充这些NULL
值。
示例 - 表格有四列:name
,telephone
,email
和city
以及如下数据:
name telephone email city
test 123 delhi
test 123 xyz@test.com
然后,由于上述行中的姓名和电话相同,我们可以使用来自第二行的数据和第一行中的第二行中的类似城市来填充第一行中的电子邮件。我听说过first_value
函数,但运行速度很慢。有替代品吗?
答案 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
替换为MIN
或MAX
。
或者您可以使用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;