;WITH Nbrs As (
SELECT Number n
FROM master..spt_values spt
WHERE spt.Type='P' And spt.Number Between 1 And 36
)
, x As (
SELECT t.Data
, Left(Substring(t.Data, n1.n, n2.n), 1) c
, n1.n p
, Len(Substring(t.Data, n1.n, n2.n)) l
FROM Nbrs n1
CROSS JOIN Nbrs n2
CROSS JOIN @t t
WHERE n2.n >1 and n1.n + n2.n <= charindex('-','AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA-', n1.n)
And Replace(Substring(t.Data, n1.n, n2.n), Left(Substring(t.Data, n1.n, n2.n), 1), '') = ''
And Left(Substring(t.Data, n1.n, n2.n), 1) != Substring(t.Data, n1.n + n2.n, 1)
And Left(Substring(t.Data, n1.n, n2.n), 1) != Substring(t.Data, n1.n - 1, 1)
)
, o As (
SELECT x.Data, Max(x.l) ml, count(*) ng
FROM x
GROUP BY x.Data
)
SELECT x.Data, x.c [Char], x.p Pos, x.l [Len]
FROM x
INNER JOIN o ON o.Data = x.Data
ORDER BY o.ml DESC, o.ng DESC, x.p;
Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this.