По сути, я хочу выбрать наилучшее совпадение префикса из таблицы «Тариф» на основе поля «Телефонный номер» в таблице «Звонок».Учитывая приведенные ниже примеры данных, «0123456789» лучше всего соответствует префиксу «012», а «0100000000» лучше всего соответствует префиксу «01».
Я включил несколько DML с некоторыми другими примерами правильных совпаденийкомментарии SQL.
В таблице тарифов будет около 70000 строк, а в таблице вызовов будет около 20 миллионов строк.Но для таблицы «Выбрать из вызова» будет установлено ограничение на основе столбца dateTime, поэтому на самом деле для запроса потребуется только более 0,5 млн. Строк вызова.
Префикс в таблице тарифов может быть до 16персонажи длинные.
Я понятия не имею, как подойти к этому в SQL, сейчас я думаю о написании функции C # SQLCLR для этого.Кто-нибудь делал что-нибудь подобное?Буду признателен за любые ваши советы.
Пример данных
Таблица вызовов:
Id TelephoneNumber
1 0123456789
2 0100000000
3 0200000000
4 0780000000
5 0784000000
6 0987654321
Таблица тарифов:
Prefix Scale
1
01 1.1
012 1.2
02 2
078 3
0784 3.1
DML
create table Rate
(
Prefix nvarchar(16) not null,
Scale float not null
)
create table [Call]
(
Id bigint not null,
TelephoneNumber nvarchar(16) not null
)
insert into Rate (Prefix, Scale) values ('', 1)
insert into Rate (Prefix, Scale) values ('01', 1.1)
insert into Rate (Prefix, Scale) values ('012', 1.2)
insert into Rate (Prefix, Scale) values ('02', 2)
insert into Rate (Prefix, Scale) values ('078', 3)
insert into Rate (Prefix, Scale) values ('0784', 3.1)
insert into [Call] (Id, TelephoneNumber) values (1, '0123456789') --match 1.2
insert into [Call] (Id, TelephoneNumber) values (2, '0100000000') --match 1.1
insert into [Call] (Id, TelephoneNumber) values (3, '0200000000') --match 2
insert into [Call] (Id, TelephoneNumber) values (4, '0780000000') --match 3
insert into [Call] (Id, TelephoneNumber) values (5, '0784000000') --match 3.1
insert into [Call] (Id, TelephoneNumber) values (6, '0987654321') --match 1
Примечание: последний '0987654321' соответствует пустой строке, потому что более подходящих совпадений нет.