汇总SQL存储过程

时间:2011-10-28 17:20:54

标签: sql-server-2008 tsql

所以我有几个SQL命令,我基本上想要做一个proc,但在这样做时,我想更优化它们。

第一部分是:

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_chargefpv_unadjusted_counterparty_chargefpv_adjusted_counterparty_charge和{{1} }。

如果这些都匹配,那么我会查看另一列fv_create_dt,并确保那两个时间戳之间的差异不到一分钟。如果有,我在EARLIER存储的行上运行另一个查询,如下所示:

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 个答案:

答案 0 :(得分:2)

您可以通过多种方式组合这些查询:

将它们放在单独的表/变量/ CTE中后,您可以轻松加入它们。

然后你还要做一件事,那就是在两个连续的行中找到日期时间的差异。有一个技巧可以做到这一点:

  1. 使用ROW_NUMBER()添加一个列,其行数由fv_create_dt排序的分组字段(tr_reference_nbr,...)分区
  2. 在A.ROW_NUMBER = B.ROW_NUMBER + 1
  3. 上进行自我加入
  4. 检查A.fv_create_dt与B.fv_create_dt之间的差异,以过滤差异小于一分钟的行
  5. 只需对您的自我加入进行一次测试,以确保只过滤您需要过滤的行。

    如果您仍然遇到此问题,请随时发表评论。

    有趣的提示:SQL Server Denali具有T-SQL增强功能LEADLAG,可以在没有自连接的情况下访问后续行和上一行。

相关问题