从结果集中找到最大值

时间:2018-12-26 15:06:46

标签: sql oracle oracle11g

我正在从结果集中找到最大值,而不得不跳过最近一个月的最大值。我该怎么办?

结果集数据:

1015|101|RT|2017/10|173124
1015|101|RT|2017/11|171053
1015|101|RT|2017/12|176462
1015|101|RT|2018/01|171064
1015|101|RT|2018/02|165132
1015|101|RT|2018/03|175738
1015|101|RT|2018/04|175072
1015|101|RT|2018/05|176743
1015|101|RT|2018/06|176541
1015|101|RT|2018/07|179983
1015|101|RT|2018/08|180841
1015|101|RT|2018/09|171178
1015|101|RT|2018/10|184095

最后一列是结果集中的计数值。我正在尝试使用Partition by并获取最新的月份数据。

select 
    client_cd,
    rep_no,
    prd_nm,
    date_ym,
    sum_cnt,
    max(sum_cnt) over(partition by PRD_NM,rep_no) as maxvalue,
    min(sum_cnt) over(partition by PRD_NM,rep_no) as minvalue
from res

然后我将“最近月份”值作为“最大值”和“最小值”。

1015|101|RT|2017/10|173124|184095|165132
1015|101|RT|2017/11|171053|184095|165132
1015|101|RT|2017/12|176462|184095|165132
1015|101|RT|2018/01|171064|184095|165132
1015|101|RT|2018/02|165132|184095|165132
1015|101|RT|2018/03|175738|184095|165132
1015|101|RT|2018/04|175072|184095|165132
1015|101|RT|2018/05|176743|184095|165132
1015|101|RT|2018/06|176541|184095|165132
1015|101|RT|2018/07|179983|184095|165132
1015|101|RT|2018/08|180841|184095|165132
1015|101|RT|2018/09|171178|184095|165132
1015|101|RT|2018/10|184095|184095|165132

我的结果应该是:

1015|101|RT|2017/10|173124|180841
1015|101|RT|2017/11|171053|180841
1015|101|RT|2017/12|176462|180841
1015|101|RT|2018/01|171064|180841
1015|101|RT|2018/02|165132|180841
1015|101|RT|2018/03|175738|180841
1015|101|RT|2018/04|175072|180841
1015|101|RT|2018/05|176743|180841
1015|101|RT|2018/06|176541|180841
1015|101|RT|2018/07|179983|180841
1015|101|RT|2018/08|180841|180841
1015|101|RT|2018/09|171178|180841
1015|101|RT|2018/10|184095|180841

用于验证但又得到不同结果的另一组数据。我用过@ D-shis查询。

1015|102|Addon|2017/10|13|20
1015|102|Addon|2017/11|13|20
1015|102|Addon|2017/12|19|20
1015|102|Addon|2018/01|15|20
1015|102|Addon|2018/02|21|20
1015|102|Addon|2018/03|17|20
1015|102|Addon|2018/04|14|20
1015|102|Addon|2018/05|20|20
1015|102|Addon|2018/06|12|20
1015|102|Addon|2018/07|19|20
1015|102|Addon|2018/08|18|20
1015|102|Addon|2018/09|9|20
1015|102|Addon|2018/10|14|20

执行查询后,我得到了高于结果的结果。

预期输出是..

1015|102|Addon|2017/10|13|21
1015|102|Addon|2017/11|13|21
1015|102|Addon|2017/12|19|21
1015|102|Addon|2018/01|15|21
1015|102|Addon|2018/02|21|21
1015|102|Addon|2018/03|17|21
1015|102|Addon|2018/04|14|21
1015|102|Addon|2018/05|20|21
1015|102|Addon|2018/06|12|21
1015|102|Addon|2018/07|19|21
1015|102|Addon|2018/08|18|21
1015|102|Addon|2018/09|9|21
1015|102|Addon|2018/10|14|21

请帮我怎么做?

非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试将DENSE_RANK窗口函数与条件汇总函数一起使用以排除最大值。

SELECT client_cd,
       rep_no,
       prd_nm,
       date_ym,
       sum_cnt,
       MAX(CASE WHEN rn > 1 THEN sum_cnt END) over(partition by PRD_NM,rep_no) as maxvalue,
       MIN(CASE WHEN rn > 1 THEN sum_cnt END) over(partition by PRD_NM,rep_no) as minvalue
FROM (
    select client_cd,
           rep_no,
           prd_nm,
           date_ym,
           sum_cnt,
           DENSE_RANK () over(partition by PRD_NM,rep_no ORDER BY sum_cnt DESC) as rn 
    from res
) t1

c# online

答案 1 :(得分:1)

您可以使用聚合子查询来计算每对maxvalue对的rep_no/prd_nm,而不必包括最新值,然后JOIN将其与表一起使用:

SELECT 
    r.client_cd,
    r.rep_no,
    r.prd_nm,
    r.date_ym,
    r.sum_cnt,
    q.maxvalue,
    q.minvalue
FROM 
    res r
    INNER JOIN (
        SELECT rep_no, prd_nm, MAX(sum_cnt) maxvalue, MIN(sum_cnt) minvalue
        FROM res
        GROUP BY repo_no, prd_nm
        HAVING date_ym != MAX(date_ym)
    ) q ON q.rep_no = r.rep_no and q.prd_nm = r.prd_nm

答案 2 :(得分:1)

您可以使用条件逻辑来做到这一点:

select r.*,
       (case when max(sum_cnt) keep (dense_rank first order by date_ym desc) over (partition by prd_num, rep_no) =
                  max(sum_cnt) over (partition by prd_nm, rep_no)
             else nth_value(sum_cnt, 2) over (partition by prd_nm, rep_no 
                                              order by sum_cnt desc
                                              rows between unbounded preceding and unbounded following
                                             )
         end)
from res r;