现有字段和数据如下:字段: nendo(年度,YYYYMMDD);entry_no(单位编号)
数据:A:20060501 0001
数据:B:20060601 0001
数据:C:20060201 0001
数据:D:20050501 0002
数据:E:20050601 0002
数据:F:20050201 0002检索的条件是,同一单位同一年度只显示一条记录,且年度的计算是有说法的,如果月分小于3月31日的算上一年度,也就是说年度的划分是从上年4月1日到今年的3月31日;上例中记录C(年度:20060201)的年度就应为2005。上面的数据应得到如下的结果: 2006 0001
2005 0001
2005 0002
2004 0002
上面的SQL语句要如何写才能实现,还请各位大侠帮忙。有劳了!
还有就是如果有几十万条记录实现起来会很慢吗?
数据:A:20060501 0001
数据:B:20060601 0001
数据:C:20060201 0001
数据:D:20050501 0002
数据:E:20050601 0002
数据:F:20050201 0002检索的条件是,同一单位同一年度只显示一条记录,且年度的计算是有说法的,如果月分小于3月31日的算上一年度,也就是说年度的划分是从上年4月1日到今年的3月31日;上例中记录C(年度:20060201)的年度就应为2005。上面的数据应得到如下的结果: 2006 0001
2005 0001
2005 0002
2004 0002
上面的SQL语句要如何写才能实现,还请各位大侠帮忙。有劳了!
还有就是如果有几十万条记录实现起来会很慢吗?
min(entry_no) entry_no
from (
select (case when substr(nendo,5,4)<= '0331' then substr(nendo,1,4) - 1 else substr(nendo,1,4)) year,
entry_no
from table
)
group by year
(case when substr(nendo,5,4)<= '0331' then substr(nendo,1,4) - 1 else substr(nendo,1,4) end) year
2 then to_number(substr(Nendo,1,4)) else to_number(substr(Nendo,1,4))-1
3 end year, entry_no from test)
4 Group by entry_no,Year; YEAR ENTRY_NO
---------- --------
2005 0001
2006 0001
2004 0002
2005 0002
from
(select decode(substrb(nendo,5,2),01,substrb(nendo,1,4)-1,
02,substrb(nendo,1,4)-1,
03,substrb(nendo,1,4)-1,
04,substrb(nendo,1,4),
05,substrb(nendo,1,4),
06,substrb(nendo,1,4),
07,substrb(nendo,1,4),
08,substrb(nendo,1,4),
09,substrb(nendo,1,4),
10,substrb(nendo,1,4),
11,substrb(nendo,1,4),
12,substrb(nendo,1,4)) nendo,
entry_no from test111);
==================================================== NENDO ENTRY
---------- -----
2004 0002
2005 0001
2005 0002
2006 0001
或许还有其他更好的方法。
基本信息放在test111表中
select distinct entry_no,
decode(
(substr(nendo,6,3) - '331'), 1 ,
substr(nendo, 1, 4) ,
substr(nendo, 1, 4) + 1)
from 表名