Обновите первый ряд самым старым, следующий - вторым самым старым и т. Д. - PullRequest
1 голос
/ 18 ноября 2011

У меня проблемы с написанием обновления в SQL Server без каких-либо отношений.Я просмотрел весь форум, но мне трудно найти ответ.

Мне нужно обновить OCR, если Клиент соответствует сумме.Проблема в том, что это не уникальный ключ.Поэтому, если у клиента есть более одной записи по комбинации сумм, мне нужно взять самое старое совпадение в таблице поиска и обновить из него OCR.Затем мне нужно взять второй самый старый и обновить второй ряд с его OCR.

Я попытался визуализировать его в таблицах ниже.

Все предложения приветствуются!

Таблица для обновления - до обновления

Customer       OCR  Amount      
740000010417        220.000     
740000010417        220.000     
740000010421        300.000     
740000010421        250.000     

Таблица поиска

Customer         OCR            Amount  Date                    ID
740000010417    222357110626    220.000 2011-11-11 15:48:48.510 100642
740000010417    222350553822    220.000 2011-10-18 10:10:26.210 18680
740000010417    222350464525    220.000 2011-10-18 10:10:26.210 18681
740000010417    222357110725    220.000 2011-11-11 15:48:48.510 102547
740000010421    222357127726    250.000 2011-11-11 15:48:48.510 102548
740000010421    222357127725    220.000 2011-10-19 10:10:26.210 102549
740000010421    222357130555    250.000 2011-10-19 10:10:26.210 102550

Таблица после обновления

Customer            OCR          Amount     
740000010417    222350553822    220.000     
740000010417    222350464525    220.000     
740000010421                    300.000     
740000010421    222357130555    250.000 

Ответы [ 2 ]

1 голос
/ 18 ноября 2011
update table set ocr = 

(select l.ocr
from 
(select l.customer as customer, l.ocr as ocr, l.amount as amount, l.date as date, ROW_NUMBER() OVER (partition by l.customer, l.amount Order BY l.date) as RowNum
from lookuptable l
order by l.date
)a

(select t.customer as customer, t.amount as amount, ROW_NUMBER() OVER (PARTITION BY t.customer, t.amount order by t.customer) as RowNum
from table t
)b
where a.customer = b.customer and a.amount=b.amount and a. rowNum = b.RowNum
)

Я не проверял его, но он может дать вам представление.

Редактировать: только что понял, нет необходимости присоединяться к внутреннему запросу.Идея состоит в том, чтобы сначала выбрать все записи из справочной таблицы и назначить им номер строки в порядке возрастания даты.так что тот же клиент и та же сумма с разными датами получат номера строк в приращениях.

Затем получите записи из старой таблицы и присвойте им номера строк, разделенные на клиента и сумму.Таким образом, мы можем сопоставить клиента, сумму и номер строки, что первый и тот же клиент и сумма будут инициализированы самым старым OCR, так как строки упорядочены по дате

0 голосов
/ 22 ноября 2011

Это то, что у меня получилось, это сработало как шарм!Спасибо, Зохайб!

UPDATE   t1
SET    t1.ocr = l1.ocr    
FROM    ( SELECT    *
              , rnk = ROW_NUMBER() OVER ( PARTITION BY t.customer,
                                          t.Amount ORDER BY t.customer, t.Amount )
           FROM      table t) t1
        LEFT JOIN 
    ( SELECT    *
              , rnk = ROW_NUMBER() OVER ( PARTITION BY l.customer,
                                          l.Amount ORDER BY l.date, l.id)
          FROM      lookuptable l) l1

      ON t1.id = l1.id
        AND t1.Amount = l1.amount
        AND t1.rnk = l1.rnk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...