我有一个表(table_old
),其中列(person_id
)有时具有重复的值。我想添加一列,对于person_id
的每个值,它都有age_at_midmonth
的最大值。Table_old
有27,236,296行。Table_new
有27,209,850行。行数不应该减少,因为这是一个没有WHERE
子句的LEFT JOIN
。这里发生了什么?我做错了吗?有没有更好的办法?
create table schema1.table_new as
select
t1.*,
t2.current_age
from
schema1.table_old t1
left join (
select person_id, max(age_at_midmonth) as current_age
from schema1.table_old
group by person_id
) t2
on t1.person_id = t2.person_id;
我知道这不是你的实际问题,但你实际上甚至不需要为那个例子做一个LEFT JOIN
。使用分析函数比将聚合作为子查询的一部分更容易。例如,您的示例查询可以转换为:
SELECT t.*,
MAX(t.age_at_midmonth) OVER (PARTITION BY t.person_id) AS CURRENT_AGE
FROM schema1.table_old t;
这里的问题是,我正在使用Analyze Table功能查看行数,然后使用Toad for Oracle查看表的Stats/Size信息。运行Analyze Table似乎并不一定产生准确的行数。当我对select count(*) from table_new;
和table_old
进行同样的操作时,我得到了完全相同的行数。哎呀。