具有SELECT、COUNT和subquery联接的SQL查询不返回行

具有SELECT、COUNT和subquery联接的SQL查询不返回行,sql,oracle,select,count,subquery,Sql,Oracle,Select,Count,Subquery,我使用下面的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 &

我使用下面的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
所以现在,我想要每个薪资组的PRD_END_DT,即在PRD_END_DT_1之前的“x”个期间,例如x=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)
请你提出可能的方法好吗。感谢您的投入。

尝试使用密集等级功能:

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


我在这里已经几个月没有特别找了。我只是在找前一段时间。上期日期也可以是前一周,而不是前一个月。现在也编辑了我的问题。@MikeG:修改答案以反映这一点。非常感谢。成功了。但是如果我不只是想要前一个月,如果我想要前一周呢。我需要将“月”改为“周”吗。是否有一个通用的解决方案,以便查询只会得到之前的“x”个周期。基本上-我在寻找maxprd_end_dt,其中日期之间的countprd_end_dt=x@MikeG:困难在于计算前一周或任何其他期间的开始时间。在许多情况下,它是一种语义计算,不受标准数学运算符的约束,并且需要使用日/月/周识别。如果你能说“x天前”,那就简单多了,你可以为这做一个通用公式。我在这里不是特别找几个月。我只是在找前一段时间。上期日期也可以是前一周,而不是前一个月。现在也编辑了我的问题。
SELECT * FROM (
  your original SELECT DISTINCT... query
) t where datediff(month, PRD_END_DT, PRD_END_DT_1) = x
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')
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