在SQL中为缺失值创建行决策树的数据准备

问题描述

当前,我的桌子是这样的

id   | valName  | valCount | type
123  |   abb    |    3     |  2
123  |   abc    |    2     |  2
123  |    b     |    5     |  2
251  |   aaa    |    2     |  1
251  |   ab     |    2     |  1
251  |   abb    |    2     |  1
251  |   ac     |    2     |  1

,依此类推。 我想为每个id填写缺少的valName并将valCount设置为0。如果我的一组不同的valName是(aaa,aab,ab,abb,abc,ac,b),它将看起来像这样。

id   | valName  | valCount | type
123  |   aaa    |    0     |  2
123  |   aab    |    0     |  2
123  |   ab     |    0     |  2
123  |   abb    |    3     |  2
123  |   abc    |    2     |  2
123  |   ac     |    0     |  2
123  |    b     |    5     |  2
251  |   aaa    |    2     |  1
251  |   aab    |    0     |  1
251  |   ab     |    2     |  1
251  |   abb    |    2     |  1
251  |   abc    |    0     |  1
251  |   ac     |    2     |  1
251  |   b      |    0     |  1

此外,数据集非常大。这样高效的查询会更好。


正如戴尔建议的那样,这是我的尝试。代码中的 TABLE 是我正在使用的表。

select  C.id,C.valName,C.type,COALESCE(D.valCount,0 ) as count

from (
    select *
    from (select id,min(type) as type
        From TABLE
        Group by id
    ) B
    cross join 
    (select distinct valName FROM TABLE) A
) C
left join TABLE D
on C.id = D.id
    and C.valName = D.valName
order by C.id

查询的想法是使用交叉连接创建id / valname表,然后使用左连接获取valCount。 该查询有效,但速度太慢。

解决方法

类似这样的东西

with unq_id_type_cte(id,[type]) as (
    select distinct id,[type] from mytable)
insert mytable(id,valName,valCount,[type])
select uitc.id,t.v,uitc.[type]
from
  (values ('aaa'),('aab'),('ab'),('abb'),('abc'),('ac'),('b')) t(v)
 cross join
  unq_id_type_cte uitc
where not exists
  (select 1 from mytable t_in where uitc.id=t_in.id
                                    and t.v=t_in.valName);

如果存在性能问题或担忧,那么尝试imo的第一件事就是将cte插入索引的临时表中。