Цикл по группам записей - PullRequest
       1

Цикл по группам записей

0 голосов
/ 21 сентября 2018

SQL Server 2014, у меня есть таблица с количеством строк, например 15, 5 имеют столбец groupid 736881 и 10 имеют столбец идентификатора группы 3084235. Что я хочу сделать, это обработать каждую группу записей по очереди изагрузить результаты в таблицу.

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

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

SELECT @LoopCounter = min(rowfilter) , @maxrowfilter = max(rowfilter) 
FROM peops6

WHILE ( @LoopCounter IS NOT NULL
        AND  @LoopCounter <= @maxrowfilter)

begin

declare @customer_dist as Table (
    [id] [int] NOT NULL,
    [First_Name] [varchar](50) NULL,
    [Last_Name] [varchar](50) NULL,
    [DoB] [date] NULL,
    [post_code] [varchar](50) NULL,
    [mobile] [varchar](50) NULL,
    [Email] [varchar](100) NULL );


INSERT INTO @customer_dist (id, First_Name, Last_Name, DoB, post_code, mobile, Email)
select id, first_name, last_name, dob, postcode, mobile_phone, email  from peops6 where rowfilter = @LoopCounter

insert into results
SELECT result.* ,
       [dbo].GetPercentageOfTwoStringMatching(result.DoB, d.DoB) [DOB%match] ,
       [dbo].GetPercentageOfTwoStringMatching(result.post_code, d.post_code) [post_code%match] ,
       [dbo].GetPercentageOfTwoStringMatching(result.mobile, d.mobile) [mobile%match] ,
       [dbo].GetPercentageOfTwoStringMatching(result.Email, d.Email) [email%match]
 FROM   (   SELECT (   SELECT MIN(id)
                      FROM   @customer_dist AS sq
                      WHERE  sq.First_Name = cd.First_Name
                             AND sq.Last_Name = cd.Last_Name
                             AND (   sq.DoB = cd.DoB  
                                     OR sq.mobile = cd.mobile
                                     OR sq.Email = cd.Email
                                     OR sq.post_code = cd.post_code )) nid ,
                  *
           FROM   @customer_dist AS cd ) AS result
       INNER JOIN @customer_dist d ON result.nid = d.id order by 1, 2 asc;

SELECT @LoopCounter  = min(rowfilter) FROM peops6
   WHERE rowfilter > @LoopCounter

end 

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я не уверен, что вам нужен LOOP, такой как SQL Cursor для выполнения этой задачи

Пожалуйста, проверьте следующую инструкцию SQL, где я использовал несколько выражений CTE

with customer_dist as (
    select
        rowfilter,
        id, first_name, last_name, dob, postcode, mobile_phone, email
    from peops6 
), result as (
    SELECT
        (
        SELECT
            MIN(id)
        FROM customer_dist AS sq
        WHERE 
            sq.rowfilter  = cd.rowfilter
        AND sq.First_Name = cd.First_Name
        AND sq.Last_Name  = cd.Last_Name
        AND (sq.DoB = cd.DoB OR sq.mobile_phone = cd.mobile_phone OR sq.Email = cd.Email OR sq.postcode = cd.postcode )
        ) nid,
        *
    FROM customer_dist AS cd
)
SELECT 
    result.* ,
    [dbo].edit_distance(result.DoB, d.DoB) [DOB%match] ,
    [dbo].edit_distance(result.postcode, d.postcode) [post_code%match] ,
    [dbo].edit_distance(result.mobile_phone, d.mobile_phone) [mobile%match] ,
    [dbo].edit_distance(result.Email, d.Email) [email%match]
FROM result
INNER JOIN customer_dist d 
    ON result.nid = d.id 
order by 1, 2 asc;

Обратите внимание, что в этой выборке я использовал нечеткое совпадение строк Алгоритм расстояния Левенштейна вместо вашей функции

И результат выглядит следующим образом enter image description here

Только вам нужно добавить оператор INSERT непосредственно перед последним оператором SELECT

Надеюсь, это полезно

0 голосов
/ 21 сентября 2018

Вам нужно усечь переменную таблицы (@customer_dist) в конце цикла:

....
-- Add this
TRUNCATE TABLE @customer_dist

SELECT @LoopCounter  = min(rowfilter) FROM peops6
   WHERE rowfilter > @LoopCounter

end

См .: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/42ef20dc-7ad8-44f7-b676-a4596fc0d593/declaring-a-table-variable-inside-a-loop-does-not-delete-the-previous-data?forum=transactsql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...