PostgreSQL - 选择具有2列复合最大值的行

时间:2018-05-30 08:45:58

标签: sql postgresql greatest-n-per-group

我想根据一些简单的规则为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;

DB中的示例商品:

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 FOOD。
  • 商家1的最佳报价是4,因为40 ALL> 30 ALL。
  • 商家2的最佳报价是5,因为50 FOOD> 40 ALL。

1 个答案:

答案 0 :(得分:4)

这可以使用distinct on()和benefit_type的自定义排序定义来实现:

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

这更喜欢更高的折扣。如果两个折扣相同,则使用ALL的benefit_type作为打破平局。

在线示例:http://rextester.com/TFBP17217