Sql 使用校验和查找指定行

Sql 使用校验和查找指定行,sql,sql-server,Sql,Sql Server,请参见下面的DDL: create table #dbNames (reference int identity not null, name1 varchar(30), name2 varchar(30), dateadded datetime, primary key (reference)) insert into #dbNames ('Bert', 'Claire', '2010-01-01') insert into #dbNames (

请参见下面的DDL:

create table #dbNames (reference int identity not null, name1 varchar(30), 
                       name2 varchar(30), dateadded datetime, primary key (reference))
insert into #dbNames ('Bert', 'Claire', '2010-01-01')
insert into #dbNames ('Claire', 'Bert', '2015-01-01')
我希望查询的输出为:

Claire Bert 2015-01-01
2015-01-01比2010-01-01更近。Claire和Bert只需在行上显示一次,即最近的行

我在考虑创建校验和列。但是,校验和产生两个不同的值:

declare @checksum int
declare @checksum2 int

set @Checksum = checksum('Claire,Bert')
set @Checksum2 = checksum('Bert,Claire')

print @checksum
print @checksum2
是否有一种算法可供我使用,以使值相同,即在上面,@Checksum和@Checksum2产生不同的结果。

尝试以下方法:

insert into #dbNames
            (
                name1
            ,   name2
            ,   dateadded
            )
    VALUES  ('Bert', 'Claire', '2010-01-01')
        ,   ('Claire', 'Bert', '2015-01-01')
        ,   ('John', 'Smith', '2015-01-02')
        ,   ('Smith', 'John', '2015-02-01')
        ,   ('Joe', 'Blow', '2015-03-01')

;WITH
    cte1 AS
    (
        SELECT      *,
                    full_name = name1 + ' ' + name2,
                    alt_name  = name2 + ' ' + name1
        FROM        #dbNames
    ),
    cte2 AS
    (
        SELECT      c1.*,
                    final_name =
                        CASE 
                            WHEN c2.reference IS NULL THEN c1.full_name
                            WHEN c1.dateadded >= c2.dateadded THEN c1.full_name
                            ELSE c2.full_name
                        END
        FROM        cte1    c1
        LEFT JOIN   cte1    c2  ON (c1.full_name = c2.full_name OR c1.full_name = c2.alt_name)
                                AND c1.reference <> c2.reference
    ),
    cte3 AS
    (
        SELECT      *,
                    rownumber = ROW_NUMBER() OVER (PARTITION BY final_name ORDER BY dateadded)
        FROM        cte2
    )

SELECT *
FROM cte3
WHERE rownumber = 1

不过,我还没有在数百万行上测试它。

校验和在其参数列表上计算一个名为校验和的散列值。哈希值用于构建哈希索引。如果校验和的参数是列,并且在计算出的校验和值上建立索引,则结果是哈希索引。这可以用于列上的相等搜索。您是否仅根据最近的日期返回Claire Bert?或者,您是否希望SQL知道名称可能被转置,并将他们视为同一个人,然后计算日期?我对你的问题感到困惑。你只需要返回一行的查询吗?或者每对名称对应一行?您可以尝试考虑一种使用拆分函数并比较fn_split'Claire,Bert'和fn_split'Bert,Claire'生成的派生表的内容的解决方案@Tab Alleman,表中有数百万行。每个组合只能有一排,即一排可以容纳:Claire,Bert和Bert,Claire。