我想根据一些简单的规则为PostgreSQL 9.6中的商家选择最佳优惠:
所以最好不仅仅是一个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 :(得分: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作为打破平局。