1

シーケンスを取得できますusing rownum() OVER (order by <field>)--または単にrownum(以下を参照)、特定のrownum/seqと「前の」2行を取得するのに苦労しています。

テーブルは日付のリストであり、各日の日付は毎月の日付に対応していますが、必ずしも現在の月とは限りません。(曜日のため、翌月の木曜日/金曜日は、前月のバケットにまだ「入っている」可能性があります)。

私の目標は、テーブルをそれ自体に結合し、今日の日付を取得してから、対応する月次日付を取得することです。私が抱えていると思う問題は、outer-outer クエリの WHERE 句で、私ができないことです: where rnum between (DDate is not NULL) and ((DDate is not NULL) -2) またはそのようなこと。

要するに -

  1. DDate が null でない行番号を取得します (SYSDATE に基づいているため、行は 1 つだけです)。
  2. 前の 2 行から MDate 値を取得します (これが最終目標であり、2 か月前の 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

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 行に制限されます。2 か月前の値だけが必要な場合 (これは少し不明確です)、= 3の代わりにそれを作成して<= 3ください。フィルターwhere daily <= trunc(sysdate)は、将来の日付がある場合に備えています。これは、テーブルの説明からもっともらしいですが、とにかく害はありません。

SQLフィドル

2 か月前の日付のみが必要な場合は、さらに簡単です。その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 に答える