它看起來像你想選擇四個最不同的日期作爲你的四個付款。我將提出一個易於理解的方式來獲得這樣的:
- 查找payment1
- 加入表中再次找到payment2
- 加入表中再次找到payment3
- ...
最終的結果是在這裏:
with step1 as (
select id, min(date) as payment1
from ps
group by id
), step2 as (
select step1.*, min(date) as payment2
from step1
join ps on step1.id = ps.id
where step1.payment1 < ps.date
group by step1.id, payment1
), step3 as (
select step2.*, min(date) as payment3
from step2
join ps on step2.id = ps.id
where step2.payment2 < ps.date
group by step2.id, payment1, payment2
), step4 as (
select step3.*, min(date) as payment4
from step3
join ps on step3.id = ps.id
where step3.payment3 < ps.date
group by step3.id, payment1, payment2, payment3
)
select * from step4
下面是一個演示它的動作:http://sqlfiddle.com/#!3/66576/8
現在,這使得4個連接,所以表現不是最好的。如果你在性能方面存在問題,那麼我會考慮對日期進行排名,選擇最低的四位(不包括重複項),然後對錶進行旋轉。
我仍然在學習語法,但我希望這很容易理解我試圖拉開。如果這看起來完全失敗,我誠摯的道歉。 –