즉, 각 단락마다 서명이 필요하고 서명을 비교해야합니다. 당신은 출력 그 자체의 성격을 언급하지 않았습니다. . 여기에, 나는 "각각 동일한 단락 서명을 쉼표로 구분 ParagraphId 값의 행을 반환하고있어
With ParagraphSigs As
(
Select P.ParagraphId
, Hashbytes('SHA1'
, (
Select '|' + S1.Text
'|' + Cast(S1.Offset As varchar(10))
'|' + Cast(S1.Score As varchar(10))
From Sentence As S1
Where S1.ParagraphId = P.ParagraphId
Order By S1.SentenceId
For Xml Path('')
)) As Signature
From Paragraph As P
)
Select Stuff(
(
Select ', ' + Cast(PS1.ParagraphId As varchar(10))
From ParagraphSigs As PS1
Where PS1.Signature = PS.Signature
For Xml Path('')
), 1, 2, '') As Paragraph
From ParagraphSigs As PS
Group By PS.Signature
이 원하는 출력에 대한 사용자 추가를 감안할 때, 당신과 같이 쿼리를 변경할 수 있습니다
With ParagraphSigs As
(
Select P.ParagraphId
, Hashbytes('SHA1'
, (
Select '|' + S1.Text
'|' + Cast(S1.Offset As varchar(10))
'|' + Cast(S1.Score As varchar(10))
From Sentence As S1
Where S1.ParagraphId = P.ParagraphId
Order By S1.SentenceId
For Xml Path('')
)) As Signature
From Paragraph As P
)
Select P1.ParagraphId, P2.ParagraphId As EquivParagraphId
From ParagraphSigs As P1
Left Join ParagraphSigs As P2
On P2.Signature = P1.Signature
And P2.ParagraphId <> P1.ParagraphId
분명히 3 개 또는 4 개의 단락이 같은 서명을 공유 할 가능성이있을 수 있으므로 위의 결과가 일치 단락 (예 : (P1, P2), (P1, P3), (P2, P1), (P2, P3), (P3, P1), (P3, P2))
의견에 abo 효과적으로 문장을 효과적으로 검색 할 수 있습니다. 이 구문을 사용할 수 있다면 잘 모르겠어요 (
With ParagraphsNeedingSigs As
(
Select P1.ParagraphId
From Paragraph As P1
Where Exists (
Select 1
From Paragraph As P2
Where P2.ParagraphId <> P1.ParagraphId
And P2.Offset = P1.Offet
And P2.Score = P1.Score
)
)
, ParagraphSigs As
(
Select P.ParagraphId
, Hashbytes('SHA1'
, (
Select '|' + S1.Text
'|' + Cast(S1.Offset As varchar(10))
'|' + Cast(S1.Score As varchar(10))
From Sentence As S1
Where S1.ParagraphId = P.ParagraphId
Order By S1.SentenceId
For Xml Path('')
)) As Signature
From ParagraphsNeedingSigs As P
)
Select P.ParagraphId, P2.ParagraphId As EquivParagraphId
From Paragraph As P
Left Join ParagraphSigs As P1
On P1.ParagraphId = P.ParagraphId
Left Join ParagraphSigs As P2
On P2.Signature = P1.Signature
And P2.ParagraphId <> P1.ParagraphId
감사합니다. 전에는 해시 함수를 보지 못했습니다. 그래서 눈을 뜨게되었습니다. 가짜 일치가 통계적으로 중요하지 않더라도 단락을 동일하게 만들기위한 힌트로 키를 사용하는 방법이 있습니까? 그렇지만 문장 비교를 사용하여 완전히 확신 할 수 있습니까? 원하는 출력에 대한 내 업데이트도 참조하십시오. – mdma
@mdma - 내 게시물을 업데이트했습니다. 즉, 두 개의 int 열을 기반으로 잠재적 인 일치가없는 단락을 필터링하고 잠재적 인 일치 가능성이있는 단락을 계산할 수 있습니다. – Thomas
내 최종 쿼리는 이와 매우 비슷합니다. 나는 이것을 INTERSECT와 결합하여 해쉬 충돌을 제거하고 문장 세트가 정말로 동등한 지 확인했다. 그러나 오버 헤드가 몇 초에서 여러 분으로 걸렸다. (나는 결코 완료하지 않았다.) 대신 해시를 고유 한 데이터가되도록 실제 데이터를 참조하십시오. – mdma