识别两行,差异为1年或更多

时间:2017-08-02 17:55:38

标签: sql sql-server sql-server-2012

我有一个名为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年。

我希望我清楚自己。

2 个答案:

答案 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年,但从上一行减去不能解决这个问题。这可能是也可能不重要,但我想指出它意味着他的意思。