2017-08-02 23 views
2

我有一張名爲「金融」的表格,我存儲了所有客戶的付款。主要列是:ID,COSTUMERID,DATEPAID,AMOUNTPAID。

我需要的是COSTUMERID的日期列表,其日期爲第一次付款,其他任何付款的日期均大於最後一年的付款日期。例如:確定兩行有1年或更長的差異

+----+------------+------------+------------+ 
| 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有2日期:第一個+一個更加有更多然後1年最後一個之後。

我希望我能讓自己清楚。

回答

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); 
+0

我做了一些修改,但基礎是你的解決方案。非常感謝你! – Antonio

0

戈登的解決方案是正確的,只要你只看着前一行(以前支付)差異,但我不知道如果安東尼正在尋找支付更高比過去一年的付款還多一年,在這種情況下,這成爲一個更復雜的問題。看看下面的例子:

CREATE TABLE #Test (
    CustomerID smallint 
    ,DatePaid date 
    ,AmountPaid smallint) 

INSERT INTO #Test 
SELECT 1, '2015-1-10', 10 
INSERT INTO #Test 
SELECT 1, '2016-1-05', 30 
INSERT INTO #Test 
SELECT 1, '2017-2-20', 30 
INSERT INTO #Test 
SELECT 1, '2017-6-30', 50 
INSERT INTO #Test 
SELECT 1, '2018-3-5', 50 
INSERT INTO #Test 
SELECT 1, '2018-5-15', 50 
INSERT INTO #Test 
SELECT 2, '2016-3-15', 100 
INSERT INTO #Test 
SELECT 2, '2017-6-15', 100 

WITH CTE AS (
    SELECT 
     CustomerID 
     ,DatePaid 
     ,LAG(DatePaid) OVER (PARTITION BY CustomerID ORDER BY DatePaid) AS PreviousPaidDate 
     ,AmountPaid 
    FROM #Test) 

SELECT 
    * 
    ,-DATEDIFF(DAY, DatePaid, PreviousPaidDate) AS DayDiff 
    ,CASE WHEN DATEDIFF(DAY, PreviousPaidDate, DatePaid) >= 365 THEN 1 ELSE 0 END AS Paid 
FROM CTE 

行號5> 1年從最近1年支付,但是從上一行中減去不解決這個問題。這可能或可能不重要,但我想指出,以防他是什麼意思。