Avatar billede Lasse Novice
24. juni 2003 - 17:50 Der er 14 kommentarer og
2 løsninger

Sammenlign kolonne med rank

Jeg har en kolonne der indeholder raekker af typen varchar(25):

Eksempel:

1) 43434sda45451
2) 54sd45sd151e
3) A451e35441134ff

Nu har jeg f.eks. et soege element:
A451e3544114ff

Dette ligner MEGET 3), men ikke saa meget de andre. Jeg kunne godt taenke mig at faa de raekker ud der har stor sammenligning, gerne med en raekke der er kaldet RANK. Andre der ville have stor RANK ville vaere:
A451e35441114ff
451e3544114ff
osv.

Hvordan goer man dette i ms sql. Skal man have indsat full text soegning.. Jeg har kigget paa det, men jeg har ikke kunne finde noget a la dette her.
Avatar billede janus_007 Nybegynder
24. juni 2003 - 23:53 #1
Det er fulltext du skal have gang i, og du skal bruge CONTAINSTABLE til det ranking!

Just go ahead :O)
Avatar billede Lasse Novice
25. juni 2003 - 00:02 #2
ja, men jeg har laest lidt om det, men de soeger paa specifikke ord, ikke noget "a la...."
Avatar billede janus_007 Nybegynder
25. juni 2003 - 00:15 #3
Har du prøvet soundex ??

Ellers er alternativet lige at skrive en lille funktion der kan klare jobbet:-)
Avatar billede janus_007 Nybegynder
25. juni 2003 - 00:20 #4
Jeg har forresten lavet sådanne funktioner i VB, der skriver ensartethed i procent :O)
Avatar billede Lasse Novice
25. juni 2003 - 00:28 #5
jeg har nok en 20000 raekker jeg skal have sammenlignet, og ville allerhelst have sql serveren til at kigge paa det.

Nej, jeg har ikke proevet soundex...

Hvad mener du helt praecist med en funktion der kan klare jobbet...?
Avatar billede Lasse Novice
25. juni 2003 - 00:33 #6
det ser ikke udtil at soundex kan goere det, eftersom den ikke maa indeholde tal
Avatar billede janus_007 Nybegynder
25. juni 2003 - 09:20 #7
Hvilket sprog programmerer du i ?
Avatar billede Lasse Novice
25. juni 2003 - 15:44 #8
jeg programmerer i c#, men hvis jeg skal til at lave en plugin til mssql, saa er "det heller ikke noget problem".

Jeg formoder at du refererer til at jeg henter alle raekkerne ud. Jeg kan ikke se at det er smart(men det er det muligvis alligevel), eftersom det er >20000. Det er meget at skulle hente ud fra en sql server over nettet.
Avatar billede venne Nybegynder
25. juni 2003 - 15:49 #9
En interessant mulighed er 'Levensthein distance', se her:
http://www.merriampark.com/ld.htm
Der er en implementation i T-SQL her:
http://www.merriampark.com/ldtsql.htm

Det ligner faktisk lige det du har brug for.
Avatar billede Lasse Novice
25. juni 2003 - 16:05 #10
Ja, jeg har vaeret inde og kigge paa record linkage, hvilket levenshtein vist nok kan gaa ind under. Det er vist lige noget af dette som jeg har brug for. Jeg vil lige kigge lidt paa det.
Avatar billede janus_007 Nybegynder
25. juni 2003 - 17:25 #11
Til den sql der ligger der mangler en funktion, den har jeg lige fixet, her er den:

create function MIN3(@a int, @b int, @c int)
returns int
as
begin
declare @mi int

SET @mi = @a

if @b < @mi SET @mi = @b
if @c < @mi SET @mi = @c

return @mi

end
Avatar billede Lasse Novice
25. juni 2003 - 17:37 #12
Med 20000 raekker tager det alligevel lidt under 2 min, hvilket er alt for meget, men sikkert den tid det tager. Jeg tror jeg vil proeve janus' ide og hente dataen ud, og proeve at processere det i c#. Vender tilbage.

Janus>> Funktionen ligger i den omtalte pakke paa siden
Avatar billede Lasse Novice
25. juni 2003 - 19:35 #13
ok, nu har jeg lige overfoert den til c#, og det viser sig at med udhentning af data og koersel af 'Levensthein distance' tager det under 5 sekunder hvor det paa sql serveren tog henmod 2 min. Det maa man jo sige er en forskel.

Janus>> du skrev at du havde en sammenlignings algoritme ogsaa... er det noget du kan share med mig?
Avatar billede janus_007 Nybegynder
25. juni 2003 - 19:43 #14
Det var en jeg skrev for mange år siden, jeg har den her i VB, men du kan vel selv oversætte :-)

Private Sub Command1_Click()
    lTimer = Timer
    For iTest = 0 To 10000
        Compare Text1, Text2
    Next iTest
    Label2 = Timer - lTimer
End Sub

Private Sub Compare(ByVal sText1 As String, ByVal sText2 As String)
    Dim arrWord1() As String
    Dim arrWord2() As String
    sText1 = Trim(sText1)
    sText2 = Trim(sText2)
    iLenghtComp = Len(sText1) - 1
    If Len(sText1) < Len(sText2) Then iLenghtComp = Len(sText2) - 1
   
   
    For n = 1 To Len(sText1)
        ReDim Preserve arrWord1(n - 1)
        arrWord1(n - 1) = Mid(sText1, n, 1)
    Next n

    For n = 1 To Len(sText2)
        ReDim Preserve arrWord2(n - 1)
        arrWord2(n - 1) = Mid(sText2, n, 1)
    Next n



    a = 0
    For n = 0 To iLenghtComp
   
        If n <= UBound(arrWord1) Then
            If arrWord1(n) = arrWord2(a) Then
            i = i + 1
           
           
            Else
                If arrWord2(a) = " " Then
                    If InStr(n, sText1, " ") Then
                        n = InStr(n, sText1, " ") - 1
                        i = i + 1
                    End If
                End If
                iMax = iMax + i
                i = 0
            End If
        End If
        If a < UBound(arrWord2) Then a = a + 1
   
    Next n
    iMax = iMax + i
   
        Label1 = iMax / (Len(sText1) + Len(sText2)) * 2
End Sub
Avatar billede janus_007 Nybegynder
26. juni 2003 - 09:13 #15
hmm den Levensthein er da ikke helt toppen... Prøv at sammenligne zoologiske med zoologisk
Avatar billede Lasse Novice
26. juni 2003 - 16:54 #16
For mig virker den fint. Jeg faar 1, hvilket jo er det rigtige. Jeg har ogsaa proevet den omvendte raekkefoelge, og det giver mig det samme.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester