SQL create table / with select语句和定义的日期范围

时间:2015-03-21 23:36:16

标签: sql oracle oracle11g

至少在过去的12个月里,我试图追踪新的身份证号码。注意,数据是这样的,一旦id号进入,它们会至少保持3 - 5年。我只是每个月运行一次。这些是规范,Oracle数据库11g版本11.2.0.3.0 - 64位生产 PL / SQL版本11.2.0.3.0 - 生产。

到目前为止,我想知道我是否可以使用更多动态日期范围并在计时器上运行整个事情,或者如果这是写东西的最佳方式。我刚刚通过谷歌搜索获取sql,并查看其他人慷慨分享的示例查询。我现在也不知道如何编写PL / SQL,但我愿意学习。

create table New_ids_calendar_year_20xx
as
select b.id_num, (bunch of other fields)
from (select * from source_table where date = last_day(date_add(sysdate,-11))a,  (select * from source_table where date = last_day(date_add(sysdate,-10))b where a.id_num (+) = b.id_num

union all 

*重复这个相同的select语句/ w union all,直到:

last_day(date_add(sysdate,0)

1 个答案:

答案 0 :(得分:1)

在Oracle中没有内置函数date_add,也许你有一些你创建的函数,无论如何添加和减去日期 我用了简单的sysdate +号码。此外,我不太确定你的整个查询背后的逻辑。对于字段名称 - 更好地避免 reserved words在列名中有date,所以我使用了 tdate在这里。

此查询执行您的联合查询在过去30天内执行的操作。对于其他时段,将30更改为其他时段。 整个解决方案基于hierarchical 子查询connect by,它给出了简单的数字列表0..29。

select b.id_num, b.field1 field1_b, a.field1 field1_a  --..., (bunch of other fields) 
  from (select level - 1 lvl from dual connect by level <= 30) l
    join source_table b 
      on b.tdate = last_day(trunc(sysdate) - l.lvl - 1) 
    left join source_table a 
      on a.id_num = b.id_num and a.tdate = last_day(trunc(sysdate) - l.lvl)
  order by lvl desc

对于日期列,如果您也存储时间,则可能需要使用trunc(tdate),但这样,如果存在日期字段,则日期字段中的索引将不起作用。 在这种情况下,将日期条件更改为x-1 <= date and date < x