【发布时间】:2014-04-29 15:05:28
【问题描述】:
SQL Fiddle 上的完整设置:http://sqlfiddle.com/#!4/1fd0e/5
我有一些包含人员 ID、级别和级别日期范围的数据,如下所示:
PID LVL START_DATE END_DATE
1 1 01.01.14 19.03.14
1 2 20.03.14 15.08.14
1 3 16.08.14 09.10.14
1 4 10.10.14 31.12.14
2 1 01.01.14 31.12.14
3 1 01.01.14 16.01.14
我需要将开始日期设置为每月的第一天,将结束日期设置为每月的最后一天。最后一天规则仅在不是该人的最后一行数据时适用。
到目前为止我所做的:
select
pid, lvl,
trunc(start_date, 'month') as start_date,
case when lead(pid, 1) over (PARTITION BY pid order by end_date) is not null
then last_day(add_months(end_date, -1))
else last_day(end_date)
end as end_date
from date_tbl t;
给我想要的输出:
PID LVL START_DATE END_DATE
1 1 01.01.14 28.02.14
1 2 01.03.14 31.07.14
1 3 01.08.14 30.09.14
1 4 01.10.14 31.12.14
2 1 01.01.14 31.12.14
3 1 01.01.14 31.01.14
但是:它只适用于我的测试数据。在包含 25k+ 行数据的表上的生产数据(我想说,女巫不是太多数据)它的执行速度非常慢。
谁能给我一个提示,我可以如何提高查询的性能?例如,要在哪些列上设置什么索引...?到目前为止唯一的索引列是 PID 列。
【问题讨论】:
-
“真的很慢”有多慢?什么是完整的查询?由于有 25K 行,我假设它们并非全部都显示在屏幕上。是否有
UPDATE语句,或者是否有谓词来限制特定人的结果?
标签: sql performance oracle lead