1

我可以得到一个序列 - using rownum() OVER (order by <field>)- 或者只是rownum(见下文),但我正在努力获得一个特定的rownum/seq 和“前一个”两行。

该表是日期列表,并且每一天的日期对应于每月的日期 -但是不一定是当前月份。(由于是星期几,下个月的周四/周五仍可能“在”上个月的存储桶中)。

我的目标是将表连接到自身,获取今天的日期,然后获取相应的每月日期。我认为我遇到的问题是在外部查询的 WHERE 子句中,我不能做: where rnum between (DDate is not NULL) and ((DDate is not NULL) -2) 或类似的事情。

简而言之 -

  1. 获取 DDate 不为空的 rownum(只有一行,因为它基于 SYSDATE)
  2. 从前两行获取 MDate 值(这是我的最终目标,两个月前的 MDate - 我需要的唯一值)

select t2.*
from (
  select rownum rnum, t1.*
  from (
    select distinct to_char(r.MONTHLY, 'YYYY-MM-DD') as MDate,
                    to_char(l.DAILY, 'YYYY-MM-DD') as DDate
    from Z_DATES l 
      right outer join Z_DATES r 
        on to_char(l.MONTHLY, 'YYYY-MM-DD') = to_char(r.MONTHLY, 'YYYY-MM-DD')
          and to_char(l.DAILY, 'YYYY-MM-DD') = to_char(SYSDATE, 'YYYY-MM-DD')
    order by 1
  ) t1
  order by rnum
) t2
-- where DDate is not NULL
-- where rnum between 11 and 13


RNUM    MDATE       DDate
11  2013-04-29  
12  2013-05-27  
13  2013-07-01  2013-07-16

4

2 回答 2

1

t1您现在的方式,这应该可以工作:

select LAG(mdate, 2) over (order by mdate)
from (
    ...
) t1
where ddate is not null

如果您重新考虑 LAG 功能的问题,我认为之后可以再清理一些(甚至可能不需要自加入)。

于 2013-07-16T15:11:59.427 回答
0

我认为这可以满足您的描述:

select to_char(monthly, 'YYYY-MM-DD') as mdate,
  to_char(daily, 'YYYY-MM-DD') as ddate
from (
  select distinct monthly,
    max(case when daily = trunc(sysdate) then daily end)
      over (partition by monthly) as daily,
    dense_rank() over (order by monthly desc) as rn
  from z_dates
  where daily <= trunc(sysdate)
)
where rn <= 3
order by monthly;

内部选择获取当前伪月的今天日期,否则为 null,并为每个月分配一个排名。然后外部选择将其限制为三行。如果您只想要两个月前的值(这有点不清楚),那么只需制作它= 3而不是<= 3. 过滤器where daily <= trunc(sysdate)是为了以防万一有任何未来的日期,这从您描述表格的方式来看是合理的,但无论如何都不会造成任何伤害。

SQL 小提琴

如果您只想要两个月前的日期,那就更简单了,您不需要做这max()部分或得到ddate

select to_char(monthly, 'YYYY-MM-DD') as mdate
from (
  select distinct monthly,
    dense_rank() over (order by monthly desc) as rn
  from z_dates
  where daily <= trunc(sysdate)
)
where rn = 3;

SQL 小提琴

于 2013-07-16T16:20:12.367 回答