我有数据,其中大多数列都有唯一数据。我只对表中的三列感兴趣,其中两列具有唯一数据。
示例数据:
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上
答案 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。