Нахождение максимального значения из набора результатов - PullRequest
0 голосов
/ 26 декабря 2018

Я нахожу максимальное значение из набора результатов и должен пропустить максимальное значение за последний месяц.Как я могу это сделать?

Данные набора результатов:

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

Последний столбец - это значение счетчика из набора результатов.Я пытаюсь использовать разделение и получать данные за последний месяц.

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 Query.

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 голосов
/ 26 декабря 2018

Вы можете использовать агрегированный подзапрос для вычисления 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
0 голосов
/ 26 декабря 2018

Вы можете сделать это с помощью условной логики:

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;
0 голосов
/ 26 декабря 2018

Можно попытаться использовать оконную функцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...