2013-08-10 11 views
5

Ho una tabella con alcune righe che hanno gruppi comuni:Come estrarre i caratteri più comuni a sinistra in un campo stringa in più righe?

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

Ad un certo punto so che il gruppo che ho bisogno di interrogare (G1 per esempio). Quindi ho bisogno di interrogare i caratteri più comuni a sinistra nel campo Name tra le righe filtrate dal loro Group. Quindi, in questo caso, ricevo ABC.

Può essere eseguito in una query? Ho bisogno di farlo nel modo più semplice possibile.

+0

+1 Che è una buona! –

+0

Conosci il numero esatto di caratteri comuni? – Chris

+0

@crudolf, Se conoscessi il numero esatto di caratteri comuni, mi limiterei a "sottostringli" :) –

risposta

1

Puoi farlo con la forza bruta:

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; 

Se non ti piace così tanto a digitare, si può anche fare:

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; 

(o utilizzare una clausola di where per ottenere il informazioni per un gruppo.) Per questo esempio, continua ad aggiungere numeri interi alla sottoquery n fino alla lunghezza che vuoi testare.

-1

È possibile trovare la massima stringa contando tutto:

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 

che restituirà il numero di voci che hanno gli stessi caratteri comuni nei primi caratteri x. La prima riga ti darà il numero totale di voci seguite dal sottogruppo superiore.

0

Mi dispiace per generatore di numeri interi sporca:

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 

Risultati:

+------+-----------+ 
| g | max(MA) | 
+------+-----------+ 
| G1 | ABC  | 
| G2 | AXX3  | 
+------+-----------+ 
Problemi correlati