【发布时间】:2017-12-10 21:21:40
【问题描述】:
数据库是 HP Vertica 7 或 PostgreSQL 9。
create table test (
id int,
card_id int,
tran_dt date,
amount int
);
insert into test values (1, 1, '2017-07-06', 10);
insert into test values (2, 1, '2017-06-01', 20);
insert into test values (3, 1, '2017-05-01', 30);
insert into test values (4, 1, '2017-04-01', 40);
insert into test values (5, 2, '2017-07-04', 10);
在过去 1 天使用的支付卡中,该卡在过去 90 天内收取的最高金额是多少。
select t.card_id, max(t2.amount) max
from test t
join test t2 on t2.card_id=t.card_id and t2.tran_dt>='2017-04-06'
where t.tran_dt>='2017-07-06'
group by t.card_id
order by t.card_id;
结果正确
card_id max
------- ---
1 30
我想将查询重写为 sql 窗口函数。
select card_id, max(amount) over(partition by card_id order by tran_dt range between '60 days' preceding and current row) max
from test
where card_id in (select card_id from test where tran_dt>='2017-07-06')
order by card_id;
但是结果集不匹配,怎么办?
这里的测试数据: http://sqlfiddle.com/#!17/db317/1
【问题讨论】:
-
首先,Postgres 和 Vertica 是两个截然不同的东西。其次,为什么您期望两个非常不同的查询的结果是相同的?
标签: postgresql join window-functions vertica