我正在从结果集中找到最大值,而不得不跳过最近一个月的最大值。我该怎么办?
结果集数据:
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
请帮我怎么做?
非常感谢。
答案 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
答案 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;