繁体   English   中英

SQL Server:对分组结果进行计算

[英]SQL Server : calculation on grouped results

在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年10月1日,Status = 0的第一条记录在2016年1月1日。 这些日期之间的天差取为9。

谢谢

这是获取每种状态的第一个日期的一种方法:

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;

尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM