2017-03-18 7 views
0

Ich habe folgende FNAMES Tabelle (es enthält etwa 58K records)Splitting Tabelle Alphabet, um in Impala/Bienenstock

+------+-------------+ 
| ID | NICKNAMES | 
+------+-------------+ 
| 1 | Avile  | 
| 2 | Dudi  | 
| 3 | Moshiko | 
| 4 | Avi  | 
| 5 | DAVE  | 
.... 

Ich möchte der Tabelle von allen Aufzeichnungen aufgeteilt, die die gleiche erste Lette enthalten, wie folgt aus:

+------+-------------+ 
| ID | NICKNAMES | 
+------+-------------+ 
| 1 | Avile  | 
| 4 | Avi  | 

| 2 | Dudi  | 
| 5 | DAVE  | 

| 3 | Moshiko | 
.... 

Für jede Spaltung würde Ich mag den Rekord mit minimalen Jaro–Winkler distance finden. Es bedeutet, dass für jeden Buchstaben, der mit "a" beginnt, der ähnlichste Datensatz gefunden wird. Was muss ich im folgenden Code ändern?

select FNAMES.* , MIN(Jaro–Winkler(FNAMES.NICKNAMES, FNAMES.NICKNAMES)) 
from FNAMES 
LEFT OUTER JOIN FNAMES 
ON(true) 
    WHERE Jaro–Winkler (FNAMES.NICKNAMES, FNAMES.NICKNAMES) <= 4 
GROUP BY FNAMES.NICKNAMES 

Antwort

1

So etwas wie dieser

select  f1.nicknames 
      ,f2.nicknames 

from  (select  f1.nicknames 
         ,f2.nicknames 
         ,rank() over 
         (
          partition by f1.nicknames 
          order by  jaro–winkler(f1.nicknames,f2.nicknames) desc 
         ) as rnk 

      from     fnames f1 

         left join fnames f2 

         on   substr(f1.nicknames,1,1) = 
            substr(f2.nicknames,1,1) 

      where  f1.nicknames < f2.nicknames 
      ) t 

where  rnk = 1 
+0

Dank Dudu! Können Sie bitte den Code speziell für die Zeile f1.nicknames Avi

+1

** (1) ** Angenommen, Sie haben eine Tabelle mit einer einzelnen Spalte "x" und zwei Zeilen - "A" und "B". 't1.x <> t2.x' wird Sie sowohl' A --- B' als auch 'B --- A' zurückgeben. 't1.x