2013-08-10 14 views
5

Mam tabeli z niektórych wierszy, które mają wspólne grupy:Jak wyodrębnić najczęściej używane znaki w polu tekstowym w wielu wierszach?

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

W pewnym momencie wiem grupę muszę kwerendy (G1 na przykład). Następnie muszę zapytać lewe najbardziej popularne znaki w polu Name wśród wierszy odfiltrowanych przez ich Group. W takim przypadku otrzymam ABC.

Czy można to wykonać w jednym zapytaniu? Muszę to zrobić w najprostszy możliwy sposób.

+0

+1 To jest dobry! –

+0

Czy znasz dokładną liczbę popularnych znaków? – Chris

+0

@crudolf, Gdybym znał dokładną liczbę zwykłych znaków, po prostu bym je "podciął" :) –

Odpowiedz

1

Można to zrobić przez brute force:

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; 

Jeśli nie podoba wpisując tyle, można również zrobić:

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; 

(Lub użyć where klauzulę, aby uzyskać informacje dla jednej grupy.) W tym przykładzie po prostu dodawaj liczby całkowite do podkwerendy n do długości, którą chcesz przetestować.

-1

można znaleźć maksymalną podciąg zliczając wszystko:

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 

który spowoduje powrót liczby wpisów zawierających te same wspólne znaki w pierwszych x znaków. Pierwszy wiersz daje całkowitą liczbę wpisów, a następnie najwyższą podgrupę.

0

Niestety o brudnej generatora liczb całkowitych:

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 

Wyniki:

+------+-----------+ 
| g | max(MA) | 
+------+-----------+ 
| G1 | ABC  | 
| G2 | AXX3  | 
+------+-----------+ 
Powiązane problemy