Конкретное соответствие строки - PullRequest
0 голосов
/ 10 марта 2019

Я работаю в SQL Server 2012. В моей таблице есть столбец с именем St_Num, данные которого выглядят следующим образом:

St_Num                 status
------------------------------
128 TIMBER RUN DR      EXP
128 TIMBER RUN DRIVE   EXP

Теперь мы можем заметить, что вданные выше.Что я хотел бы сделать, так это то, что если число в этом случае 128 и первые 3 буквы в столбце St_Num одинаковы, то обе эти строки должны считаться одинаковыми, как показано ниже:

St_Num                status
-----------------------------
128 TIMBER RUN DR     EXP

Я провел некоторый поиск по этому поводу и обнаружил, что функция left или подстроки здесь может быть полезна, но я не знаю, как они будут использоваться здесь, чтобы получить то, что мне нужно, и не знаю, смогут ли они решить мою проблему.Любая помощь в том, как получить желаемый результат, будет отличной.

Ответы [ 5 ]

1 голос
/ 11 марта 2019

Я не очень одобряю вашу логику сопоставления.,,но это не твой вопрос.Большая проблема в том, как долго число перед строкой.Таким образом, вы можете получить самый короткий из адресов, используя:

select distinct t.*
from t
where not exists (select 1
                  from t t2
                  where left(t2.st_num, patindex('%[a-zA-Z]%') + 2, t.st_num) = left(t.st_num, patindex('%[a-zA-Z]%', t.st_num) + 2) and
                        len(t.St_Num) < len(t2.St_Num)
                 );
1 голос
/ 10 марта 2019

Это выведет только первую из соответствующих строк:

with cte as (
  select *,
  row_number() over (order by (select null)) rn
  from tablename
)
select St_Num, status from cte t
where not exists (
  select 1 from cte
  where 
    left(St_Num, 7) = left(t.St_Num, 7)
    and
    rn < t.rn
)

См. Демоверсию

1 голос
/ 10 марта 2019

Вы можете использовать группировку по status и substring(St_Num,1,3)

with t(St_Num, status) as
(
 select '128 TIMBER RUN DR'   ,'EXP' union all
 select '128 TIMBER RUN DRIVE','EXP'   
) 
select min(St_Num) as St_Num, status
  from t    
 group by status, substring(St_Num,1,3);

St_Num              status
-----------------   ------
128 TIMBER RUN DR   EXP
1 голос
/ 10 марта 2019

Возможно, это можно сделать, используя подзапрос так же, как вы удалите дубликаты в таблице, так:

SELECT Str_Num, status
FROM <your_table> a
WHERE NOT EXISTS (SELECT 1
FROM <your_table> b
WHERE SUBSTRING(b.Str_Num, 1, 7) = SUBSTRING(a.Str_Num, 1, 7));

Однако это будет работать только в том случае, если число гарантировано будет длиной 3 символа.или, если вы не возражаете, нужно больше символов, если число меньше символов.

0 голосов
/ 11 марта 2019

У меня все еще странное ощущение, что ваших критериев недостаточно для сопоставления с теми же адресами, но это может помочь, поскольку учитывается также длина номера:

WITH ParsedAddresses(st_num, exp, number)
AS
(
    SELECT st_num,
    exp,
    number = ROW_NUMBER() OVER(PARTITION BY LEFT(st_num, CHARINDEX(' ', st_num) + 3) ORDER BY LEN(st_num))
    FROM <table_name>
)
SELECT st_num, exp FROM ParsedAddresses
WHERE number = 1
...