我有一个名为finance的表,我存储了客户的所有付款。主要栏目是:ID,COSTUMERID,DATEPAID,AMOUNTPAID。
我需要的是COSTUMERID的日期列表,其中包括第一次付款的日期以及最后一次付款的任何其他付款。例如:
+----+------------+------------+------------+
| ID | COSTUMERID | DATEPAID | AMOUNTPAID |
+----+------------+------------+------------+
| 1 | 1 | 2015-01-10 | 10 |
| 2 | 1 | 2016-01-05 | 30 |
| 2 | 1 | 2017-02-20 | 30 |
| 3 | 2 | 2016-03-15 | 100 |
| 4 | 2 | 2017-02-15 | 100 |
| 5 | 3 | 2017-05-01 | 25 |
+----+------------+------------+------------+
我期望的结果是:
+------------+------------+
| COSTUMERID | DATEPAID |
+------------+------------+
| 1 | 2015-01-01 |
| 1 | 2017-02-20 |
| 2 | 2016-03-15 |
| 3 | 2017-05-01 |
+------------+------------+
客户1有两个日期:第一个+另一个在最后一个之后超过1年。
我希望我清楚自己。
答案 0 :(得分:3)
我想你只想要lag()
:
select t.*
from (select t.*,
lag(datepaid) over (partition by customerid order by datepaid) as prev_datepaid
from t
) t
where prev_datepaid is null or
datepaid > dateadd(year, 1, prev_datepaid);
答案 1 :(得分:0)
戈登的解决方案是正确的,只要您只查看上一行(之前的付款)差异,但我想知道安东尼奥是否正在寻找从过去1年付款中超过一年的付款,在这种情况下,这变成一个更复杂的问题需要解决。请看以下示例:
{
"Code": "Admin",
"Groups":
[
{
"Code":"Administrator"
},
{
"Code":"Superuser"
},
{
"Code":"User"
}
]
}
第5行是>从最近1年付款起1年,但从上一行减去不能解决这个问题。这可能是也可能不重要,但我想指出它意味着他的意思。