PostgreSQL - выберите строку с составным максимальным значением из 2 столбцов - PullRequest
0 голосов
/ 30 мая 2018

Я бы хотел выбрать лучшие предложения для продавца в PostgreSQL 9.6 по нескольким простым правилам:

  • Предложение лучше другого, если его скидка выше независимо от типа выгоды
  • Если значения скидок равны, то с типом льготы ALL будет лучше, чем с FOOD
  • Если и скидка, и тип льготы совпадают, то можно выбрать любое предложение, например, выбрать первое

Так что лучше всего это не просто вызов max (), а "условный" max (), где нужно проверить и другой столбец, чтобы определить, какая это строка.

Не могли бы вы помочь?

Схема:

create table offer (
    id bigserial not null,
    discount int4,
    benefit_type varchar(25),
    ...
    merchant_id int8 not null
);

Запрос (частичный):

select merchant_id, max(discount) as max_discount
from offer
group by merchant_id;

Примеры предложений в БД:

id  discount    benefit_type    ... merchant_id
0   10          FOOD                0
1   20          FOOD                0
2   20          ALL                 0
3   30          ALL                 1
4   40          ALL                 1
5   40          FOOD                1
6   40          ALL                 2
7   50          FOOD                2

Требуемый набор результатов:

merchant_id     max_discount    benefit_type
0               20              ALL
1               40              ALL
2               50              FOOD
  • Лучшее предложение продавца 0 - это предложение 2, потому что 20 ALL> 20 ЕДА.
  • Лучшее предложение продавца 1 - это предложение 4, потому что 40 ALL> 30 ALL.
  • Лучшее предложение Merchant 2 - это предложение 5, потому что 50 ЕД> 40 ALL.

1 Ответ

0 голосов
/ 30 мая 2018

Этого можно добиться, используя distinct on() и пользовательское определение сортировки для тип_приятия:

select distinct on (merchant_id) *
from offer
order by merchant_id, 
         discount desc, 
         case when benefit_type = 'ALL' then 1 else 2 end;

. Предпочитает более высокую скидку.Если две скидки одинаковы, в качестве тай-брейка используется преимущество_ ALL.

Онлайн пример: http://rextester.com/TFBP17217

...