Sql 使用校验和查找指定行
请参见下面的DDL: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 (
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。