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,查询工作正常。谢谢