Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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:如何比较SQL Server中的连续行_Sql_Sql Server - Fatal编程技术网

SQL:如何比较SQL Server中的连续行

SQL:如何比较SQL Server中的连续行,sql,sql-server,Sql,Sql Server,我有一个包含按客户代码分组的事务记录的表 典型的表类似于客户端、事务类型、日期和结果 我需要找到一种特殊类型交易的有效性 例如 如果在第1天发送了短信息,并且在发送短信息的4个工作日内有积极结果,则可以将其视为有效短信息 样本表: 预期产出: 如何将单个记录与特定客户机代码上的所有事务进行逐行比较 提前谢谢 使用分组方式并存在 编辑:替代解决方案 select d1.client, d1.[sms count], d2.[eff sms count] from

我有一个包含按客户代码分组的事务记录的表

典型的表类似于客户端、事务类型、日期和结果

我需要找到一种特殊类型交易的有效性

例如

如果在第1天发送了短信息,并且在发送短信息的4个工作日内有积极结果,则可以将其视为有效短信息

样本表:

预期产出:

如何将单个记录与特定客户机代码上的所有事务进行逐行比较

提前谢谢

使用分组方式并存在

编辑:替代解决方案

select d1.client, 
       d1.[sms count],
       d2.[eff sms count]
from (
    select client, 
       count(*) [sms count]
    from data
    where ttype = 'sms'
    group by client
) d1
join 
(
    select client, count(*) [eff sms count]
    from data t
    where  ttype = 'sms' and exists(
        select 1
        from data h
        where h.client = t.client and
           h.day between t.day and t.day + 4 and
           h.outcome = 'pos'
    )
    group by t.client
) d2 on d1.client = d2.client
对于这两种解决方案,应提供以下索引

data(ttype, client)
data(outcome, client, day)
试试这个:-

select CLIENT,
   SUM(case when isnull(A.TTYPE,'') <> ''  THEN 1 END) SMS_Count ,
         SUM( case when isnull(A.TTYPE,'') <> '' and A.DAY  <= 4 THEN 1 END)   EFF SMS COUNT 

 from a inner join b on a.Client on b.client and a.TTYPE = b.TTYPE
GROUP BY CLIENT

在2600条客户记录和26k条记录中进行了尝试。我已经跑了将近一个小时了。还有其他选择吗?@SudharsanRajesh现在检查一下。别忘了创建索引。工作起来很有魅力。必须创建临时表,然后创建索引,因为我是通过视图从另一个数据库获取数据的。
select CLIENT,
   SUM(case when isnull(A.TTYPE,'') <> ''  THEN 1 END) SMS_Count ,
         SUM( case when isnull(A.TTYPE,'') <> '' and A.DAY  <= 4 THEN 1 END)   EFF SMS COUNT 

 from a inner join b on a.Client on b.client and a.TTYPE = b.TTYPE
GROUP BY CLIENT