1

次のデータを返す以下のselectクエリがあります。

クエリ:

SELECT DISTINCT ALLVW.GP_PAYGROUP,
                ALLVW.PRD_END_DT,
                TMP.PRD_END_DT
FROM PS_AZ_DFN_ALPRD_VW ALLVW,
     PS_AZ_DFMPRP_TMP4 TMP
WHERE ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
  AND ALLVW.PRD_END_DT < TMP.PRD_END_DT

結果:

PAYGROUP    PRD_END_DT      PRD_END_DT_1

AMZ_PG_T1   31-JAN-12   31-DEC-12
AMZ_PG_T1   29-FEB-12   31-DEC-12
AMZ_PG_T1   31-MAR-12   31-DEC-12
AMZ_PG_T1   30-NOV-12   31-DEC-12
AMZ_PG_T2   31-JAN-12   31-OCT-12
AMZ_PG_T2   30-SEP-12   31-OCT-12
AMZ_PG_T2   31-MAR-12   31-OCT-12
AMZ_PG_T2   30-APR-12   31-OCT-12

したがって、ここで、forがx = 1になる前に、「x」の期間数であるforeachが必要PRD_END_DTです。クエリは次を返す必要があります。PAYGROUPPRD_END_DT_1

 PAYGROUP    PRD_END_DT      PRD_END_DT_1
 AMZ_PG_T1   30-NOV-12       31-DEC-12
 AMZ_PG_T2   30-SEP-12       31-OCT-12

私は以下を行うのに疲れましたが、すべての助けにはなりません:

SELECT DISTINCT ALLVW.GP_PAYGROUP,
                ALLVW.PRD_END_DT,
                TMP.PRD_END_DT
FROM PS_AZ_DFN_ALPRD_VW ALLVW,
     PS_AZ_DFMPRP_TMP4 TMP
WHERE ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
  AND ALLVW.PRD_END_DT < TMP.PRD_END_DT
  AND 1 =
    (SELECT COUNT(XVW.PRD_END_DT)
     FROM PS_AZ_DFN_ALPRD_VW XVW
     WHERE XVW.GP_PAYGROUP = TMP.GP_PAYGROUP
       AND XVW.PRD_END_DT < TMP.PRD_END_DT)

考えられるアプローチを提案してください。あなたの入力に感謝します。

4

3 に答える 3

0
SELECT * FROM (
  your original SELECT DISTINCT... query
) t where datediff(month, PRD_END_DT, PRD_END_DT_1) = x
于 2013-02-14T16:40:14.787 に答える
0
SELECT DISTINCT ALLVW.GP_PAYGROUP, ALLVW.PRD_END_DT, TMP.PRD_END_DT
FROM PS_AZ_DFN_ALPRD_VW ALLVW
JOIN PS_AZ_DFMPRP_TMP4 TMP ON ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
WHERE ALLVW.PRD_END_DT < TMP.PRD_END_DT
  AND add_months(trunc(ALLVW.PRD_END_DT, 'month'), 1) >= trunc(TMP.PRD_END_DT, 'month')
于 2013-02-14T16:40:37.190 に答える
0

関数を試して使用してくださいdense_rank

例えば

Select a, b, c
From ( select a, b, c, dense_rank() over (partition by a order by b desc) r
       from table)
Where r < :x
于 2013-02-15T07:15:07.880 に答える