Sql 派生在多个列上匹配但某些列值可能为NULL的记录组
我想要一种有效的方法,可以跨多个字段导出匹配记录组。假设我有下表: 创建表cust id INT不为空, 类VARCHAR1 NULL, cust_类型VARCHAR1 NULL, 术语VARCHAR1 NULL ; 插入cust 价值观 1、'A',空,'C',和, 2,NULL,'B','C',和, 3、'A','B',空, 4,空,空,'C', 5,'D','E',空, 6,'D',空,空; 我希望得到的是一组ID,匹配的值将一组记录统一到三个字段类、cust_type和terms上,这样我就可以为组应用唯一的ID 在本例中,记录1-4构成三个字段上的一个匹配组,而记录5-6构成单独的匹配 以下内容将完成此工作: **但是,有更好的方法吗?**在超过一百万行的表上运行此查询是痛苦的。。。 正如Graham在评论中指出的那样,如果添加了另一条将所有记录分组在一起的记录,则上述查询不满足要求 应将以下值分组为一组:Sql 派生在多个列上匹配但某些列值可能为NULL的记录组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想要一种有效的方法,可以跨多个字段导出匹配记录组。假设我有下表: 创建表cust id INT不为空, 类VARCHAR1 NULL, cust_类型VARCHAR1 NULL, 术语VARCHAR1 NULL ; 插入cust 价值观 1、'A',空,'C',和, 2,NULL,'B','C',和, 3、'A','B',空, 4,空,空,'C', 5,'D','E',空, 6,'D',空,空; 我希望得到的是一组ID,匹配的值将一组记录统一到三个字段类、cust_type和terms上,这样
INSERT INTO cust
VALUES
(1,'A',NULL,'C'),
(2,NULL,'B','C'),
(3,'A','B',NULL),
(4,NULL,NULL,'C'),
(5,'D','E',NULL),
(6,'D',NULL,NULL),
(7,'D','B','C');
将产生:
id match_group
-- -----------
1 1
2 1
3 1
4 1
5 1
6 1
…因为D组的类值记录为5、6和7。C的术语值将记录1、2和4与该组匹配,而cust_类型值B或类值A则拉入记录3
希望这一切都有意义。我认为递归选择无法实现这一点。 我做了类似的事情,尝试使用临时表识别独特的家庭&使用以下逻辑重复更新: 对于每个类别| cust|u type |术语,获取最小id并更新临时表:
update temp
from
(
SELECT
class, -- similar for cust_type & terms
min(id) as min_id
from temp
group by class
) x
set id = min_id
where temp.class = x.class
and temp.id <> x.min_id
;
重复所有三次更新,直到没有一次更新一行。你能用文字解释记录是如何“匹配”的吗?如果你的数据有D/B/C,那么我认为你的匹配不起作用。你需要把逻辑想得更清楚一点。@TT。在这种情况下,我的意思是针对特定列的值是相同的。因此,id=1的类值与id=3的类值相同,因此我知道它们表示相同的cust实体。@Lee Ok,因此1和3匹配,但您声明1、2、3和4在三个字段上都匹配到一个组中。最好有一个正式的解释来表明这些记录都属于同一个组。@GordonLinoff-Gah-是的,你是对的。但是,如果有另一个记录具有这些值,我希望查询返回一个分组ID,即统一所有记录的类和术语值。。。有什么想法吗?
update temp
from
(
SELECT
class, -- similar for cust_type & terms
min(id) as min_id
from temp
group by class
) x
set id = min_id
where temp.class = x.class
and temp.id <> x.min_id
;