在SQL Server 2014中,来自一组记录(例如在TableA
中),日期列为[LogDate]
(已记录时),状态列为[Status]
(例如0和1)和UserID [UserID]可能是同一用户的记录很少,在不同的日期具有相同的状态。
我想锻炼时差(对于所有用户),在第一个日期之间记录为状态= 0然后第一次状态是= 1为每个用户(这样我可以获得该时间的总和)。我相信它可以做到,我只是一直走进死胡同。我会感激任何想法,所以我可以继续......
数据示例:
UserId LogDate Status
--------------------------
1 01/01/2016 1
1 02/01/2016 1
1 07/01/2016 1
1 10/01/2016 0
1 11/01/2016 1
1 12/01/2016 0
2 01/01/2016 1
2 02/01/2016 1
2 07/01/2016 0
2 10/01/2016 0
2 11/01/2016 1
2 12/01/2016 0
对于UserID = 1,我希望得到9天的结果,对于UserID = 2,我希望获得6天的结果。获得这些的结果似乎很简单。
计算UserID 1的天数:Status = 1的第一条记录是2016年1月1日,Status = 0的第一条记录是01/01/2016。这些日期之间的天数差异为9。
谢谢
答案 0 :(得分:1)
以下是获取每种状态的第一个日期的一种方法:
select userId,
max(case when seqnum = 1 and status = 0 then logDate end) as logDate_0,
max(case when seqnum = 1 and status = 1 then logDate end) as logDate_1
from (select t.*,
row_number() over (partition by userId, status order by logDate) as seqnum
from t
) t
group by userId;
答案 1 :(得分:1)
试试这个
DECLARE @Tbl TABLE (UserId INT, LogDate DATETIME, Status INT)
INSERT INTO @Tbl
select 1 , '2016.01.01', 1 union all
select 1 , '2016.01.02', 1 union all
select 1 , '2016.01.07', 1 union all
select 1 , '2016.01.10', 0 union all
select 1 , '2016.01.11', 1 union all
select 1 , '2016.01.12', 0 union all
select 2 , '2016.01.01', 1 union all
select 2 , '2016.01.02', 1 union all
select 2 , '2016.01.07', 0 union all
select 2 , '2016.01.10', 0 union all
select 2 , '2016.01.11', 1 union all
select 2 , '2016.01.12', 0
SELECT
M.UserId,
DATEDIFF(dd, MIN(M.StartLogDate) ,MIN(M.EndLogDate)) AS DayOfLogDate
FROM
(
SELECT
C.UserId,
CASE WHEN C.Status = 1 THEN C.LogDate ELSE (SELECT NULL) END AS StartLogDate,
CASE WHEN C.Status = 0 THEN C.LogDate ELSE (SELECT NULL) END AS EndLogDate
FROM
@Tbl C
) M
GROUP BY
M.UserId
输出:
UserId DayOfLogDate
1 9
2 6