.计算一个表中的记录与其他记录相比较的数量!
有一个表,有字段ID,F1-F9,SUM。F1-F9的值由1,2,3组成。
(为了好理解,本例子中数据只改变了F1,F2的值,其他的字段值不变)
ID F1 F2 F3 F4 F5 F6 F7 F8 F9 SUM
1 1 2 2 3 3 1 2 3 3
2 2 2 2 3 3 1 2 3 3
3 3 2 2 3 3 1 2 3 3
4 3 3 2 3 3 1 2 3 3
5 3 1 2 3 3 1 2 3 3
现计算每一条记录和其他记录字段相同数为8的数量,并将值存到当前记录SUM字段中。
例如:ID1和其他记录比较,与ID2有8个字段相同,与ID3有8个字段相同,与ID4有7个字段相同,
与ID5有7个字段相同,所以8个字段相同的数量为2,记录1的SUM值得到为2;
如此,依次比较ID2和其他记录的数量,依次比较ID3和其他记录的数量,
依次比较ID4和其他记录的数量,依次比较ID5和其他记录的数量.
结果如下表
ID F1 F2 F3 F4 F5 F6 F7 F8 F9 SUM
1 1 2 2 3 3 1 2 3 3 2
2 2 2 2 3 3 1 2 3 3 2
3 3 2 2 3 3 1 2 3 3 4
4 3 3 2 3 3 1 2 3 3 2
5 3 1 2 3 3 1 2 3 3 2
(表中记录数量可能是几万条,所以求运算速度比较快的方法)
已用下面的方法实现!现金问题是,表中数据比较多,下面的方法比较慢。有什么办法思路可以快速实现?
create table tb(ID int,F1 int,F2 int,F3 int,F4 int,F5 int,F6 int,F7 int,F8 int,F9 int,[SUM] int)
insert into tb values(1 ,1 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(2 ,2 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(3 ,3 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(4 ,3 ,3 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(5 ,3 ,1 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
go
update tb set [sum] = t.cnt from tb ,
( select m.id , count(1) cnt from tb m, tb n where m.id <> n.id and
(case when m.f1 = n.f1 then 1 else 0 end) +
(case when m.f2 = n.f2 then 1 else 0 end) +
(case when m.f3 = n.f3 then 1 else 0 end) +
(case when m.f4 = n.f4 then 1 else 0 end) +
(case when m.f5 = n.f5 then 1 else 0 end) +
(case when m.f6 = n.f6 then 1 else 0 end) +
(case when m.f7 = n.f7 then 1 else 0 end) +
(case when m.f8 = n.f8 then 1 else 0 end) +
(case when m.f9 = n.f9 then 1 else 0 end) = 8
group by m.id )
t
where tb.id = t.id select * from tb drop table tb
/*
ID F1 F2 F3 F4 F5 F6 F7 F8 F9 SUM ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 1 1 2 2 3 3 1 2 3 3 2 2 2 2 2 3 3 1 2 3 3 2 3 3 2 2 3 3 1 2 3 3 4 4 3 3 2 3 3 1 2 3 3 2 5 3 1 2 3 3 1 2 3 3 2
(所影响的行数为 5 行) */
CREATE FUNCTION fun_Ty
(@ID INT,@F1 INT,@F2 INT, @F3 INT, @F4 INT, @F5 INT, @F6 INT, @F7 INT, @F8 INT, @F9 INT)
RETURNS INT
AS
BEGIN
DECLARE @s INT
SELECT @S=COUNT(1)
FROM [tb] WHERE Id<>@ID AND (1-ABS(SIGN(F1-@F1)))
+(1-ABS(SIGN(F2-@F2)))
+(1-ABS(SIGN(F3-@F3)))
+(1-ABS(SIGN(F4-@F4)))
+(1-ABS(SIGN(F5-@F5)))
+(1-ABS(SIGN(F6-@F6)))
+(1-ABS(SIGN(F7-@F7)))
+(1-ABS(SIGN(F8-@F8)))
+(1-ABS(SIGN(F9-@F9)))=8
RETURN @S
END
SELECT *,DBO.FUN_TY(ID,F1,F2,F3,F4,F5,F6,F7,F8,F9) FROM [TB]
--不用函数也可以直接Update
UPDATE [Tb] SET [SUM]=(
SELECT COUNT(1) FROM [Tb] WHERE ID<>z.ID AND (1-ABS(SIGN(F1-z.F1)))
+(1-ABS(SIGN(F2-z.F2)))
+(1-ABS(SIGN(F3-z.F3)))
+(1-ABS(SIGN(F4-z.F4)))
+(1-ABS(SIGN(F5-z.F5)))
+(1-ABS(SIGN(F6-z.F6)))
+(1-ABS(SIGN(F7-z.F7)))
+(1-ABS(SIGN(F8-z.F8)))
+(1-ABS(SIGN(F9-z.F9)))=8
) FROM [Tb] z