嗯,其实这个早就该顺手记了。然而太懒。趁此良机,为本月流水账充个数~~
EDIT: --这篇是再发布,因为我发现之前的版本根本就是瞎扯淡,特此纠正:
经常遇到某些表格数值,要去找它的连续区间,光靠min(date),max(date) group by可能不够,因为这个数值可能出现了一段连续时间后,变化了,又过了一段时间又变化回去。此时就需要row_number()。不过亿级表尽量还是别,这里等于是三层嵌套了。
你用不上row_number的~~ left join 就能搞定,也没有嵌套可讲,当然运行开销还是一样很大。
select final.curve_code,final.curve_type,final.curve_name,final.trading_date as min_date,min(c.trading_date) as max_date from curve_intervals as final
left join curve_intervals as b on final.curve_code = b.curve_code and final.curve_type = b.curve_type and final.curve_name = b.curve_name and final.trading_date = AddDate(b.trading_date,1)
left join curve_intervals as c on final.curve_code = c.curve_code and final.curve_type = c.curve_type and final.curve_name = c.curve_name and final.trading_date <= c.trading_date
left join curve_intervals as d on d.curve_code = c.curve_code and d.curve_type = c.curve_type and d.curve_name = c.curve_name and c.trading_date = AddDate(d.trading_date,-1)
where b.trading_date is null and c.trading_date is not null and d.trading_date is null
group by final.curve_code,final.curve_type,final.curve_name,final.trading_date