Часто полезно иметь таблицу диапазонов или последовательностей, которая дает вам источник больших наборов последовательных последовательных чисел, таких как этот, покрывающий диапазон -100 000 + 100 000.
drop table dbo.range
go
create table dbo.range
(
id int not null primary key clustered ,
)
go
set nocount on
go
declare @i int = -100000
while ( @i <= +100000 )
begin
if ( @i > 0 and @i % 1000 = 0 ) print convert(varchar,@i) + ' rows'
insert dbo.range values ( @i )
set @i = @i + 1
end
go
set nocount off
go
Если у вас есть такая таблица, вы можете сделать что-то вроде этого:
select character = substring( t.some_column , r.id , 1 ) ,
frequency = count(*)
from dbo.some_table t
join dbo.range r on r.id between 1 and len( t.some_column )
group by substring( t.some_column , r.id , 1 )
order by 1
Если вы хотите обеспечить нечувствительность к регистру, просто добавьте нужные upper()
или lower()
:
select character = upper( substring( t.some_column , r.id , 1 ) ) ,
frequency = count(*)
from dbo.some_table t
join dbo.range r on r.id between 1 and len( t.some_column )
group by upper( substring( t.some_column , r.id , 1 ) )
order by 1
Учитывая ваши образцы данных:
create table dbo.some_table
(
some_column varchar(50) not null
)
go
insert dbo.some_table values ( 'Elias' )
insert dbo.some_table values ( 'Sails' )
insert dbo.some_table values ( 'Pails' )
insert dbo.some_table values ( 'Plane' )
insert dbo.some_table values ( 'Games' )
go
Последний запрос выше дает следующие результаты:
character frequency
A 5
E 3
G 1
I 3
L 4
M 1
N 1
P 2
S 5
person
Nicholas Carey
schedule
23.06.2014