2013-08-10 6 views
5

Ich habe eine Tabelle mit einigen Zeilen, die gemeinsame Gruppen:Wie extrahieren Sie die am häufigsten verwendeten Zeichen in einem Zeichenfolgenfeld in mehreren Zeilen?

Id Name Group 
1  ABC1 G1 
2  ABC2 G1 
3  ABC3 G1 
4  AXX3 G2 

Irgendwann habe ich die Gruppe weiß, ich muss abfragen (G1 zum Beispiel). Dann muss ich die am weitesten links stehenden Zeichen im Name Feld zwischen den Zeilen abfragen, die durch ihre Group gefiltert werden. In diesem Fall würde ich ABC bekommen.

Kann dies in einer Abfrage durchgeführt werden? Ich muss das auf die einfachste Art und Weise tun.

+0

+1 Das gut ist! –

+0

Kennen Sie die genaue Anzahl der gemeinsamen Zeichen? – Chris

+0

@crudolf, Wenn ich die genaue Anzahl der gemeinsamen Zeichen wüsste, würde ich sie einfach "substring" :) –

Antwort

1

Sie können es mit brutaler Gewalt tun:

select groupid, 
     (case when min(left(name, 10)) = max(left(name, 10)) then left(name, 10) 
      when min(left(name, 9)) = max(left(name, 9)) then left(name, 9) 
      when min(left(name, 8)) = max(left(name, 8)) then left(name, 8) 
      when min(left(name, 7)) = max(left(name, 7)) then left(name, 7) 
      when min(left(name, 6)) = max(left(name, 6)) then left(name, 6) 
      when min(left(name, 5)) = max(left(name, 5)) then left(name, 5) 
      when min(left(name, 4)) = max(left(name, 4)) then left(name, 4) 
      when min(left(name, 3)) = max(left(name, 3)) then left(name, 3) 
      when min(left(name, 2)) = max(left(name, 2)) then left(name, 2) 
      when min(left(name, 1)) = max(left(name, 1)) then left(name, 1) 
     end) as CommonPrefix 
from t 
group by groupid; 

Wenn Sie nicht so viel tippen, können Sie auch tun:

select groupid, 
     max(case when min(left(name, n.n)) = max(left(name, n.n)) then left(name, n.n) end) 
from t cross join 
    (select 1 as n union all selet 2 union all select 3 . . . 
    ) n 
group by groupid; 

(Oder verwenden Sie einen where Klausel die bekommen Informationen für eine Gruppe.) Für dieses Beispiel fügen Sie der Unterabfrage n ganze Zahlen bis zur Länge hinzu, die Sie testen möchten.

-1

Sie können die maximale Teilkette durch Zählen alles:

select k.common, k.setSize, k.number from 
(select left(name, z.n) common, count(*) setSize, z.n number 
     from t 
     join (select 0 as n union all select 1 union all select 3 ...) as z 
     group by left(name, z.n)) k 
order by k.setSize desc, k.number desc 

, die Sie die Anzahl der Einträge, die die gleichen gemeinsamen Zeichen in den ersten x Zeichen zurück. In der ersten Zeile wird die Gesamtzahl der Einträge angezeigt, gefolgt von der obersten Untergruppe.

0

traurig über schmutzige integer Generator:

select TT.g, max(MA) from 
    (select t.g, max(left(t.Name,N.n)) MA, min(left(t.Name,N.n)) MI 
    from t cross join 
    (select 0 as n union all select 1 union all select 3 union all 
    select 4 union all select 5 union all select 6 union all 
    select 6 union all select 7 union all select 8 union all select 9) N 
    group by t.g, N.n 
) TT 
where TT.MA = TT.MI 
group by TT.g 

Ergebnisse:

+------+-----------+ 
| g | max(MA) | 
+------+-----------+ 
| G1 | ABC  | 
| G2 | AXX3  | 
+------+-----------+ 
Verwandte Themen