DateDiff行UserID匹配的位置

时间:2016-06-16 12:44:00

标签: tsql

在Sql Server 2012(T-SQL)上,我想分析同一用户ID的结束日期和开始日期之间的日期差异,并查看时间之间是否存在等于或大于12个月的差距。

因此,对于哪个ContractID,开始日期比上一个结束日期=> 12m。

ContractID   UserID    StartDate     EndDate      12m Lapse
     1         779     01/01/2000    01/01/2010     False
     2         779     01/01/2010    01/01/2015     False
     3         779     01/01/2016    NULL           True  
     4        1021     09/03/2008    NULL           False

值得注意的是,在真实表上,userID不是按顺序排列的,只有contractID是。

3 个答案:

答案 0 :(得分:1)

使用CTELAG()窗口功能非常简单:

创建样本数据:

DECLARE @T as table
(
    ContractID int,
    UserID int,
    StartDate date,
    EndDate date
)

INSERT INTO @T VALUES
(1, 779, '01/01/2000', '01/01/2010'),
(2, 779, '01/01/2010', '01/01/2015'),
(3, 779, '01/01/2016', NULL),  
(4, 1021, '09/03/2008', NULL)

查询:

;WITH CTE AS 
(
    SELECT  ContractID,
            UserID,
            StartDate,
            EndDate,
            LAG(EndDate) OVER(PARTITION BY UserId ORDER BY StartDate) As PreviousEndDate
    FROM @T
)

SELECT  ContractID,
        UserID,
        StartDate,
        EndDate,
        CASE WHEN DATEDIFF(MONTH, ISNULL(PreviousEndDate, StartDate), StartDate) >= 12 THEN
            'True'
        ELSE
            'False'
        END As '12m Lapse'
FROM CTE

结果:

ContractID  UserID      StartDate  EndDate    12m Lapse
----------- ----------- ---------- ---------- ---------
1           779         2000-01-01 2010-01-01 False
2           779         2010-01-01 2015-01-01 False
3           779         2016-01-01 NULL       True
4           1021        2008-09-03 NULL       False

答案 1 :(得分:0)

SELECT * FROM Table WHERE DATEDIFF(M,StartDate,EndDate) >=12

答案 2 :(得分:0)

从SQL Server 2012开始,有一个名为Lag的函数可以帮助您获得所需内容。

窗口函数的<div class="col-md-8"> <table class="table table-striped"> <h3>Menu</h3> <thead><tr><th>Dish</th><th>Price</th><th>Calories</th></tr></thead> <tbody> <%= @restaurant.each do |restaurant| %> <tr> <td><%= restaurant.menu.dish %></td> <td><%= restaurant.menu.price %></td> <td><%= restaurant.menu.price %></td> </tr> <tr><td>..</td><td>..</td><td>..</td></tr> <% end %> </tbody> </table> </div> 将确保它与partition by隔开,而userID将确保其按order by顺序。

ContractID
相关问题