Запрос на основе сравнения нескольких данных - PullRequest
0 голосов
/ 04 мая 2020

Таблица:

enter image description here

Как мне привести период, когда клиенты имеют максимум cc_limit? Если cc_limits для клиента больше одного месяца, возьмите период с самыми высокими данными года-месяца

1 Ответ

0 голосов
/ 04 мая 2020

Используйте row_number() оконную функцию, ниже должно работать.

  select *
     from 
        (select cust_no,year_month,cc_limit,cc_tot_risk,cc_period_risk,cc_ins_risk,
        row_number() over(partition by cust_no order by cc_limit desc) rownum
         from tablename order by cust_no,year_month desc) tab
      where rownum = 1

РЕДАКТИРОВАТЬ: Чтобы выяснить, почему order by должно быть в строке зрения.

Сценарий: при наличии дублирующих записей для одних и тех же cc_limit и cust_no необходимо получить запись с наибольшим годовым месяцем.

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

Предположим, сначала вставляется запись 201912, а затем 201911 (хотя практически невозможно, хотя во время реорганизации базы данных порядок вставки может быть изменен), а затем без * Предложение 1016 * будет возвращать запись 201911 вместо 201912.

create table test  (cust_no INT,yearmonth varchar(10),cc_limit INT,
cc_tot_risk INT,cc_period_risk INT,cc_ins_risk INT)

# cust_no 1 сначала вставляется запись 201912, а затем 201912 и имеет такой же cc_limit.

insert into test values(1,201911,16000,16,16,0);
insert into test values(2,201912,15000,16,16,0);
insert into test values(1,201912,16000,16,16,0);
insert into test values(3,201912,17000,16,16,0);
insert into test values(4,201911,10000,16,16,0);

при выполнении запроса без order by во встроенном представлении

 select *
     from 
        (select cust_no,yearmonth,cc_limit,cc_tot_risk,cc_period_risk,cc_ins_risk,
        row_number() over(partition by cust_no order by cc_limit desc) rownum
         from test) tab
      where rownum = 1

Годовой месяц, возвращенный для cust_no 1, равен 201911 вместо 201912

enter image description here* 1 031 *

Но запрос с предложением order by обеспечит возвращение последней годовой записи,

 select *
         from 
            (select cust_no,year_month,cc_limit,cc_tot_risk,cc_period_risk,cc_ins_risk,
            row_number() over(partition by cust_no order by cc_limit desc) rownum
             from tablename order by cust_no,year_month desc) tab
          where rownum = 1

enter image description here

I продемонстрировали все поведение в ссылке DBFIDDLE для MySQL8.0 - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=03b06094d10a0daf7732f0cb19798262

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