Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 计算SQL Server中的连续项_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 计算SQL Server中的连续项

Sql server 2005 计算SQL Server中的连续项,sql-server-2005,tsql,Sql Server 2005,Tsql,我想写的查询有问题。我有一个表格,列出了收到电子邮件的人。有一个名为Active的位列,如果它们已响应,该列将设置为true。但我需要计算此人自第一封电子邮件或最后一封活动电子邮件以来一直处于非活动状态的连续电子邮件的数量 例如,此基本表显示一个人已收到9封电子邮件。他们在两封电子邮件(3和5)中都很活跃。因此,他们的非活动计数将是4,因为我们从第6号电子邮件开始计算 PersonID(int) EmailID(int) EmailDate(datetime) Active(b

我想写的查询有问题。我有一个表格,列出了收到电子邮件的人。有一个名为Active的位列,如果它们已响应,该列将设置为true。但我需要计算此人自第一封电子邮件或最后一封活动电子邮件以来一直处于非活动状态的连续电子邮件的数量

例如,此基本表显示一个人已收到9封电子邮件。他们在两封电子邮件(3和5)中都很活跃。因此,他们的非活动计数将是4,因为我们从第6号电子邮件开始计算

PersonID(int)    EmailID(int)    EmailDate(datetime)    Active(bit)
1                1               2009-07-18 19:56:20    0
1                2               2009-08-18 19:56:20    0
1                3               2009-09-18 19:56:20    1
1                4               2009-10-18 19:56:20    0
1                5               2009-11-18 19:56:20    1
1                6               2009-12-18 19:56:20    0
1                7               2010-01-18 19:56:20    0
1                8               2010-02-18 19:56:20    0
1                9               2010-03-18 19:56:20    0
任何指点或帮助都会很好

问候 格雷格

试试看:

SET NOCOUNT ON
DECLARE @Emails table (PersonID int, EmailID int,  Active bit)
INSERT @Emails VALUES ( 1,1,0)
INSERT @Emails VALUES ( 1,2,0)
INSERT @Emails VALUES ( 1,3,1)
INSERT @Emails VALUES ( 1,4,0)
INSERT @Emails VALUES ( 1,5,1)
INSERT @Emails VALUES ( 1,6,0)
INSERT @Emails VALUES ( 1,7,0)
INSERT @Emails VALUES ( 1,8,0)
INSERT @Emails VALUES ( 1,9,0)
INSERT @Emails VALUES ( 2,1,0)
INSERT @Emails VALUES ( 2,2,0)
INSERT @Emails VALUES ( 2,3,0)
INSERT @Emails VALUES ( 2,4,0)
INSERT @Emails VALUES ( 2,5,0)
INSERT @Emails VALUES ( 2,6,0)
INSERT @Emails VALUES ( 3,1,1)
INSERT @Emails VALUES ( 3,2,1)
INSERT @Emails VALUES ( 3,3,1)
INSERT @Emails VALUES ( 3,4,1)
SET NOCOUNT OFF


SELECT
    e.PersonID,COUNT(e.EmailID) AS CountInactive
    FROM @Emails e
        LEFT OUTER JOIN (SELECT
                             PersonID,MAX(EmailID) AS LastActive
                             FROM @Emails
                             WHERE Active=1
                             GROUP BY PersonID
                        ) dt ON e.PersonID=dt.PersonID
    WHERE e.EmailID>ISNULL(dt.LastActive,0)
    GROUP BY e.PersonID
输出:

PersonID    CountInactive
----------- -------------
1           4
2           6

(2 row(s) affected)
编辑OP编辑后,输出与上述相同:

SELECT
    e.PersonID,COUNT(e.EmailID) AS CountInactive
    FROM @Emails e
        LEFT OUTER JOIN (SELECT
                             PersonID,MAX(EmailDate) AS LastActive
                             FROM @Emails
                             WHERE Active=1
                             GROUP BY PersonID
                        ) dt ON e.PersonID=dt.PersonID
    WHERE (e.EmailDate>ISNULL(dt.LastActive,0)) OR dt.PersonID IS NULL
    GROUP BY e.PersonID
我的第一个剪辑:

SELECT PersonID, COUNT(*) FROM Table T1
WHERE Active = 0 AND EmailDate > 
   (SELECT MAX(EMailDate) FROM Table T2 
       WHERE T2.PersonID = T1.PersonID AND Active = 1)
GROUP BY PersonID
请注意,此解决方案要求每个人至少回复一封电子邮件。如果您想包括从发送给他们的第一封电子邮件开始就处于非活动状态的人,则需要将(MAX(EmailDate))术语包装在某种类型的IFNULL()中,该IFNULL()返回系统开始日期之前的空值


此外,正如KM在下面指出的那样,如果某人当前没有处于非活动状态(他们回复了最近的电子邮件),他们将不在结果集中。我认为这可能满足您的需要,但如果不满足,请告诉我。

一个版本的@Larry Lustig的答案,使用COALESCE返回没有电子邮件的用户的计数:

SELECT PersonID, COUNT(*) FROM Table T1
WHERE Active = 0 AND EmailDate > 
   COALESCE (
       (SELECT MAX(EMailDate) FROM Table T2 
           WHERE T2.PersonID = T1.PersonID AND T2.Active = 1),
       DATEFROMPARTS(1900,1,1))
GROUP BY PersonID

My 2c-活动列应称为HasResponsed以实际指示操作。您的示例数据是否准确描述了问题?我的意思是,EmailID是否总是保证在每个PersonID值内是连续的(编号不中断)?电子邮件有相关的日期。我想我会编辑这篇文章来反映这一点。我关于EmailID的问题仍然与日期保持一致-如果ID是连续的,你的问题会更容易解决。嗨,Larry,不能保证EmailID是连续的。但是EmailDate将是(只是按应该的方式添加)。如果表中有多个员工,则不起作用。嗨,Larry,谢谢你,它似乎在我的完整数据集中返回了良好的结果。谢谢@KM:为什么不呢?“内部选择”与“外部人物ID”相关。@Greg:很高兴能提供帮助。@Thomas:OP要求的不是最长的不活动序列,而是当前的不活动序列。