Сборка хранимого процесса SQL - PullRequest
1 голос
/ 28 октября 2011

Итак, у меня есть пара SQL-команд, которые я в основном хочу сделать проком, но при этом я хотел бы оптимизировать их немного больше.

Первая часть этого такова:

select tr_reference_nbr
from cfo_daily_trans_hist
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id
inner join cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id AND fpv_status_bit = 1
group by tr_reference_nbr, fv_dh_daily_trans_hist_id
having count(*)>1

Этот запрос возвращает мне информацию о том, какие tr_reference_nbr существуют, и в нашей системе есть повторяющиеся данные, которые необходимо удалить. После запуска я запускаю этот другой запрос, копируя и вставляя в tr_reference_nbr по одному запросу, который мне дал указанный выше запрос:

select 
tr_reference_nbr , dh_daily_trans_hist_id ,cfo_fas157_project_valuation.*,
cfo_daily_trans_hist.* ,
cfo_fas157_valuation.* 
from cfo_daily_trans_hist
inner join cfo_fas157_valuation on fv_dh_daily_trans_hist_id = dh_daily_trans_hist_id 
inner join cfo_tran_quote on tq_tran_quote_id = dh_tq_tran_quote_id
inner join cfo_transaction on tq_tr_transaction_id = tr_transaction_id
iNNER JOIN cfo_fas157_project_valuation ON fpv_fas157_project_valuation_id = fv_fpv_fas157_project_valuation_id
where
tr_reference_nbr in
(
[PASTEDREFERENCENUMBER]
)
and fpv_status_bit = 1
order by dh_val_time_stamp desc

Теперь этот запрос дает мне кучу записей для этого конкретного tr_reference_nbr. Затем я должен просмотреть эти данные и найти строки, которые имеют совпадение (дубликат) dh_daily_trans_hist_id. Как только это будет найдено, я просматриваю и проверяю, чтобы следующие строки также соответствовали этой строке, поэтому я знаю, что они являются истинными дубликатами: fpv_unadjusted_sponsor_charge, fpv_adjusted_sponsor_charge, fpv_unadjusted_counterparty_charge и fpv_adjusted_counterparty_charge.

Если все совпадают, я смотрю на еще один столбец, fv_create_dt, и проверяю, что разница между двумя отметками времени составляет менее минуты. Если есть, я запускаю еще один запрос для строки, которая была сохранена РАНЬШЕ, которая выглядит следующим образом:

begin tran
update cfo_fas157_valuation set fpv_status_bit = 0 where fpv_fas157_project_valuation_id = [IDRECIEVEDFROMTHEOTHERTABLE]
commit

Как вы можете видеть, это все еще очень ручной процесс, хотя у нас есть несколько написанных запросов, но я пытаюсь найти решение для того, чтобы мы могли просто выполнить один запрос, и это в основном сделало бы ВСЕ, кроме для окончательного запроса. Так что в основном это то, что должно предоставить нам несколько fpv_fas157_project_valuation_id, которые необходимо обновить.

Из этих запросов кто-нибудь из вас, ребята, видит простой способ объединить все это? Я работал над этим весь день и не могу заставить себя что-то запустить. Я чувствую, что продолжаю портить соединения и все такое.

Спасибо!

1 Ответ

2 голосов
/ 01 ноября 2011

Вы можете объединить эти запросы несколькими способами:

После того, как они у вас есть в отдельных таблицах / переменных / CTE, вы можете легко объединить их.

Затем вам нужно сделать еще одну вещь, а именно найти разницу во времени в двух последовательных строках.Для этого есть хитрость:

  1. используйте ROW_NUMBER () , чтобы добавить столбец с номером строки, разделенной по группирующим полям (tr_reference_nbr, ...), упорядоченным по fv_create_dt
  2. сделать самостоятельное соединение на A.ROW_NUMBER = B.ROW_NUMBER + 1
  3. проверить разницу между A.fv_create_dt и B.fv_create_dt, чтобы отфильтровать строки с разницей менее минуты

Просто сделайте хороший тест своего самообъединения, чтобы убедиться, что вы фильтруете только строки, которые нужно отфильтровать.

Если у вас все еще есть проблемы с этим, не стесняйтесь оставлять комментарии.

Интересное примечание: SQL Server Denali имеет улучшения T-SQL LEAD и LAG для доступа к следующей и предыдущей строке без самостоятельных объединений.

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