2017-08-02 17 views
2

私は顧客のすべての支払いを保管するfinanceというテーブルを持っています。主な列は:ID、COSTUMERID、DATEPAID、AMOUNTPAIDです。

私が必要とするのは、COSTUMERIDの最初の支払いの日付と最後の支払いの1年以上の支払いの日付のリストです。例:私は、結果として期待するもの差額が1年以上ある2つの行を特定します

+----+------------+------------+------------+ 
| 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 | 
+----+------------+------------+------------+ 

:最初の1 +最後の1年後、より多くを持っている1以上:

+------------+------------+ 
| COSTUMERID | DATEPAID | 
+------------+------------+ 
|   1 | 2015-01-01 | 
|   1 | 2017-02-20 | 
|   2 | 2016-03-15 | 
|   3 | 2017-05-01 | 
+------------+------------+ 

貸衣装1は、2日を持っています。

私は自分自身を明確にすることを望む。

私はあなただけ lag()をしたいと思います

答えて

3

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

ゴードンのソリューションは、限り、あなたは唯一の前の行(前回のお支払い)の差分を見ていると、正しいですが、アントニオは大きな支払いを探している場合、私は疑問に思います過去1年間の支払いから1年を超える場合、これは解決するためにより複雑な問題になります。以下の例を見てみましょう:

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年ですが、前の行から差し引くことは、これを解決しません。これは重要かもしれないし、重要ではないかもしれないが、私はそれが彼が何を意味するのかを指摘したかった。

関連する問題