SQL Server中的行减法

SQL Server中的行减法,sql,sql-server,Sql,Sql Server,我有这样一个数据集: ID | IssueDate 194924 | 2013-07-31 00:00:00.000 194924 | 2010-06-15 00:00:00.000 194924 | 2012-07-30 00:00:00.000 194924 | 2012-12-11 00:00:00.000 194924 | 2014-08-04 00:00:00.000 194966 | 201

我有这样一个数据集:

ID       | IssueDate               
194924   | 2013-07-31 00:00:00.000 
194924   | 2010-06-15 00:00:00.000  
194924   | 2012-07-30 00:00:00.000   
194924   | 2012-12-11 00:00:00.000    
194924   | 2014-08-04 00:00:00.000    
194966   | 2012-06-02 00:00:00.000 
194966   | 2011-02-03 00:00:00.000 
194966   | 2011-02-01 00:00:00.000 
194987   | 2013-04-25 00:00:00.000 
194987   | 2010-12-03 00:00:00.000 
我想先用ID和IssueDate对数据进行排序,然后减去两个连续行的IssueDates(找出一行和下一行之间的时间),然后计算每个唯一ID的最大、最小和平均时间。

我不确定CTE1中的“和c1.ID=c.ID”,因为我不确定您的确切要求。无论如何,你可以试试这样的东西

declare @t table(ID int,IssuDate datetime)
insert into @t values          
(194924,'2013-07-31 00:00:00.000') 
,(194924,'2010-06-15 00:00:00.000')  
,(194924,'2012-07-30 00:00:00.000')   
,(194924,'2012-12-11 00:00:00.000')    
,(194924,'2014-08-04 00:00:00.000')    
,(194966,'2012-06-02 00:00:00.000') 
,(194966,'2011-02-03 00:00:00.000') 
,(194966,'2011-02-01 00:00:00.000') 
,(194987,'2013-04-25 00:00:00.000') 
,(194987,'2010-12-03 00:00:00.000') 

;with CTE as
(select *,ROW_NUMBER()over(order by id,IssuDate)rn
from @t 
)
,Cte1 as
(
select * 
,(select datediff(second,c.IssuDate,c1.IssuDate) from CTE c1 where c1.rn=c.rn+1 and c1.id=c.id)Time_between
from CTE C
)

select sum(Time_between),min(Time_between),avg(Time_between),max(Time_between) from cte1 
group by id

如果您的Sql Server版本是2014,那么下面的版本可能会对您有所帮助

您案例的架构:

    CREATE TABLE #TAB (
        ID BIGINT
        ,IssuDate DATETIME
        )

    INSERT INTO #TAB
    SELECT 194924
        ,'2013-07-31 00:00:00.000'
        UNION ALL
    SELECT 194924
        ,'2010-06-15 00:00:00.000'
        UNION ALL
    SELECT 194924
        ,'2012-07-30 00:00:00.000'
        UNION ALL
    SELECT 194924
        ,'2012-12-11 00:00:00.000'
        UNION ALL
    SELECT 194924
        ,'2014-08-04 00:00:00.000'
        UNION ALL
    SELECT 194966
        ,'2012-06-02 00:00:00.000'
        UNION ALL
    SELECT 194966
        ,'2011-02-03 00:00:00.000'
        UNION ALL
    SELECT 194966
        ,'2011-02-01 00:00:00.000'
        UNION ALL
    SELECT 194987
        ,'2013-04-25 00:00:00.000'
        UNION ALL
    SELECT 194987
        ,'2010-12-03 00:00:00.000'
排序并找到时差后的结果:

    SELECT *, DATEDIFF(DD, ISNULL(LAG(ISSUDATE)  OVER(PARTITION BY ID ORDER BY ID,IssuDate ), IssuDate),IssuDate) AS TIME_DIFF_IN_DAYS  
    FROM #TAB
用于最小最大值和平均值的聚合

    SELECT ID, MIN(TIME_DIFF_IN_DAYS) AS MIN_TIME_TAKEN, MAX(TIME_DIFF_IN_DAYS) MAX_TIME_TAKEN, AVG(TIME_DIFF_IN_DAYS) AVG_TIME_TAKEN FROM (
    SELECT *, DATEDIFF(DD, ISNULL(LAG(ISSUDATE)  OVER(PARTITION BY ID ORDER BY ID,IssuDate ), IssuDate),IssuDate) AS TIME_DIFF_IN_DAYS  FROM #TAB
    )AS A
    WHERE TIME_DIFF_IN_DAYS>0  --This one you can comment if you want to show 0 diffence in time
    GROUP BY ID

您至少可以发布预期结果。您使用的sql server版本是什么?@APH sql server2014@FelixPamittan每行,用客户的唯一ID显示客户购买的日期。我想查找任何客户购买之间的最大、最小和平均时间。@Maygoon,编辑您的问题并发布实际的预期结果,不是对它的描述。我不是要求您在#选项卡中插入数据。我已经为我的计算动态创建了它。您可以直接查询您的实际数据@MaygoonDear@Shaker Mirza,查询工作正常。谢谢