SQL根据列值拉回最新不同记录

时间:2018-11-14 19:21:39

标签: sql-server tsql sql-server-2014

我有数据,其中大多数列都有唯一数据。我只对表中的三列感兴趣,其中两列具有唯一数据。

示例数据:

Ins_Cd | Encounter | Date
-------------------------------
A00    | 12345678  | 01-01-2001
A00    | 98765432  | 02-01-2001

从上面我想返回第二条记录

Ins_Cd | Encounter | Date
-------------------------------
A00    | 98765432  | 02-01-2001

我编写了以下代码,我认为可以对其进行改进。它运行得很快,大约只有9秒,而视图中的记录不到200万条。

SELECT Pyr1_Co_Plan_Cd
, PtNo_Num
, Dsch_Date
, [rn] = ROW_NUMBER() over(
    partition by pyr1_co_plan_cd 
    order by dsch_date desc
    )

into #temp

FROM schema.my_view

where Med_Rec_No is not null
and Dsch_Date is not null
and LEFT(PtNo_Num, 1) != '2'
and LEFT(ptno_num, 4) != '1999'
and LEFT(ptno_num, 1) != '9'

order by Pyr1_Co_Plan_Cd
, Dsch_Date desc
;

select a.Pyr1_Co_Plan_Cd
, a.PtNo_Num
, a.Dsch_Date

from #temp as a

where a.rn = 1

order by a.Pyr1_Co_Plan_Cd
;

drop table #temp
;

以上确实给了我我想要的东西。我如何才能更有效地编写此内容?还是应该将其发布在codereview上

1 个答案:

答案 0 :(得分:2)

应该可以继续进行代码审查,但是既然您在这里...

您的代码似乎包含不在您的数据中的列,尤其是您的分区列。也许这是要分区的正确列,但看起来很奇怪。

一种加快速度并且不使用临时表的方法。这将加快处理速度,因为不必执行INSERT操作。如果您查看您的实际执行计划,我敢打赌,插入内容占查询总费用的很大百分比。而是使用派生表或CTE。

select
       Pyr1_Co_Plan_Cd
     , PtNo_Num
     , Dsch_Date
from
    (SELECT 
       Pyr1_Co_Plan_Cd
     , PtNo_Num
     , Dsch_Date
     , [rn] = ROW_NUMBER() over(partition by pyr1_co_plan_cd order by dsch_date desc)
    FROM 
       schema.my_view
    where 
       Med_Rec_No is not null
       and Dsch_Date is not null
       and LEFT(PtNo_Num, 1) != '2'
       and LEFT(ptno_num, 4) != '1999'
       and LEFT(ptno_num, 1) != '9') x
where RN = 1
order by Pyr1_Co_Plan_Cd

如果您准备使用TEMP TABLE,则还可以通过删除order by Pyr1_Co_Plan_Cd, Dsch_Date desc部分上的SELECT INTO #temp来加快处理速度。这种排序是不必要的,并且根本不会给您带来任何好处,特别是因为您要在最终选择中对结果进行排序,并且正在使用窗口函数来计算具有order by的RN。