2013-02-14 143 views
1

我有一个返回以下数据下面的选择查询:SQL查询连接不返回行

查询:

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 

所以现在,我希望PRD_END_DT对于每个PAYGROUP,例如x = 1的PRD_END_DT_1之前的'x'个周期数,我的查询应返回:

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) 

你可以建议可能的方法吧。欣赏你的投入。

回答

0
SELECT * FROM (
    your original SELECT DISTINCT... query 
) t where datediff(month, PRD_END_DT, PRD_END_DT_1) = x 
+0

我不是特意在这里寻找月份。我只是在寻找前一段时间。前一个日期日期也可能在前一周而不是月份。现在也编辑我的问题。 – 2013-02-14 16:50:08

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') 
+0

我不是特意在这里寻找几个月。我只是在寻找前一段时间。前一个日期日期也可能在前一周而不是月份。现在也编辑我的问题。 – 2013-02-14 16:49:18

+0

@MikeG:修改答案来反映这一点。 – PinnyM 2013-02-14 16:52:18

+0

收到“月份 - 无效标识符错误” – 2013-02-14 17:03:51

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