Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 在SQL server中,将表与表本身进行比较最有效的方法是什么?_Sql Server - Fatal编程技术网

Sql server 在SQL server中,将表与表本身进行比较最有效的方法是什么?

Sql server 在SQL server中,将表与表本身进行比较最有效的方法是什么?,sql-server,Sql Server,我最近开发了一些代码,可以识别我目前工作的保险公司的首次呼叫解决方案。代码基本上从调用数据表创建两个相同的SELECT语句,按成员id、调用日期和调用时间对数据进行排序和排序,然后在成员id和调用类型相等的情况下将每个查询相互比较,但是秩或RowId不是这样的,所以从内部联接的一侧到另一侧的每个RowId都会进行比较,但对同一个RowId不会进行比较。这作为一个准循环来比较所有记录,以查看呼叫日期>14天或呼叫日期相等且呼叫时间>24小时…对于相同的呼叫类型和相同的成员id 输出结果如下: 我

我最近开发了一些代码,可以识别我目前工作的保险公司的首次呼叫解决方案。代码基本上从调用数据表创建两个相同的SELECT语句,按成员id、调用日期和调用时间对数据进行排序和排序,然后在成员id和调用类型相等的情况下将每个查询相互比较,但是秩或RowId不是这样的,所以从内部联接的一侧到另一侧的每个RowId都会进行比较,但对同一个RowId不会进行比较。这作为一个准循环来比较所有记录,以查看呼叫日期>14天或呼叫日期相等且呼叫时间>24小时…对于相同的呼叫类型和相同的成员id

输出结果如下:

我知道这不是解决这个问题的最有效的方法,我想知道是否有一种方法可以编写内部连接部分,其中只有一个排序表用于迭代第二个排序表的记录,而不是每个表相互迭代?从执行计划的角度来看,我很欣赏任何关于如何使这段代码使用更少的系统资源并提高效率的见解。
谢谢

为什么这很重要->T2.RowID T1.RowID?表中有多少条记录?您是一次性处理所有数据还是仅处理部分数据,如使用分页或筛选数据。我认为您的输出是错误的,在这种情况下,请显示您希望的输出。你好,Ross,这使查询能够查看下一条记录,因为它不需要查看每个表中相同的确切记录。嗨,Kumar,如果可以应用日期参数,可能会有数百万条记录。我已经测试了输出,它给出了期望的结果。代码正在为该MEM_ID在14天内查找相同的MEM_ID和CAT_DESC。如果该条件为false,则调用第一次得到解决,并在FCR_Ind字段中显示1。如果在14天内为同一MEM_ID和CAT_DESC…接到另一个呼叫,则原始呼叫未解决,FCR_Ind应反映为0。
Here is a sample of the code:

DECLARE @Temp TABLE (
[MEM_ID] [varchar](10) NULL,
       [CALL_DATE] [datetime2](3) NULL,
       [CALL_TIME] [varchar](8) NULL,
       [OPER_CODE] [varchar](8) NULL,
       [TEXT_DEPT] [varchar](6) NULL,
       [CAT_DESC] [varchar](30) NULL
)

INSERT INTO @Temp
VALUES ('00000-1400', '2018-07-16 00:00:00.000','10:12:23','YYZ2500','SERV06','PLAN BENEFITS')
,('00000-1400', '2018-06-10 00:00:00.000','10:12:23','YYZ2500','SERV06','PLAN BENEFITS')
,('00000-1400', '2018-07-01 00:00:00.000','18:12:23','YYZ2500','SERV06','CLAIMS')
,('00000-1400', '2018-07-02 00:00:00.000','05:12:23','YYZ2500','SERV06','OTHER')
,('00000-1400', '2018-07-14 00:00:00.000','02:12:23','YYZ2500','SERV06','CLAIMS')
,('00000-1400', '2018-07-27 00:00:00.000','11:12:23','YYZ2500','SERV06','PLAN BENEFITS')
,('00000-1400', '2018-06-30 00:00:00.000','08:12:23','YYZ2500','SERV06','PLAN BENEFITS')
,('00000-1400', '2018-06-29 00:00:00.000','07:12:23','YYZ2500','SERV06','AUTHORIZATIONS')
,('00000-1400', '2018-06-29 00:00:00.000','07:26:23','YYZ2500','SERV06','AUTHORIZATIONS')
,('00000-1400', '2018-06-25 00:00:00.000','09:38:23','YYZ2500','SERV06','OTHER')


Select Calc.*, CASE WHEN Calc.Disposition = 'No subsequent within 14' THEN CONVERT(tinyint, 1) ELSE 0 END as FCR_Ind

From  (Select DISTINCT Final.RowID, Final.CallCount, Final.MEM_ID, Final.CALL_DATE, 
    Final.CALL_TIME, Final.CAT_DESC, Final.OPER_CODE, Final.TEXT_DEPT,
       CASE WHEN Final.[Had a subsequent within 14 days] IS NULL 
       THEN 'No subsequent within 14' ELSE Final.[Had a subsequent within 14 days]
       END as Disposition
       From  (Select *
 From (Select DISTINCT T1.RowID, T1.CallCount, T1.MEM_ID, T1.CALL_DATE, 
    T1.CALL_TIME, T1.CAT_DESC, T1.OPER_CODE, T1.TEXT_DEPT,
CASE WHEN T2.CALL_DATE BETWEEN T1.CALL_DATE AND DateAdd(DAY, 14, T1.CALL_DATE) AND T2.RowID <> T1.RowID AND T2.CALL_DATE <> T1.CALL_DATE OR T2.CALL_TIME BETWEEN T1.CALL_TIME AND DateAdd(HOUR, 24, T1.CALL_DATE) AND T2.RowID <> T1.RowID AND T2.CALL_DATE = T1.CALL_DATE THEN 'Had a subsequent within 14 days' END as Disposition                                                           
               From   (Select ROW_NUMBER() OVER (PARTITION BY MEM_ID ORDER BY MEM_ID,
              [CALL_DATE], CALL_TIME) AS RowID, Count(CALL_TIME) as CallCount,
  MEM_ID, [CALL_DATE], CALL_TIME, CAT_DESC, OPER_CODE, TEXT_DEPT
                       From @Temp
                       Group by MEM_ID, [CALL_DATE], CALL_TIME, CAT_DESC, OPER_CODE, 
                    TEXT_DEPT) as T1
        Inner Join  (Select ROW_NUMBER() OVER (PARTITION BY MEM_ID ORDER BY MEM_ID, 
                [CALL_DATE], CALL_TIME) AS RowID, Count(CALL_TIME) as
                CallCount, MEM_ID, [CALL_DATE], CALL_TIME, CAT_DESC,
                OPER_CODE, TEXT_DEPT
    From @Temp
                Group by MEM_ID, [CALL_DATE], CALL_TIME, CAT_DESC, OPER_CODE,
        TEXT_DEPT) as T2
                      ON   T1.MEM_ID = T2.MEM_ID AND T1.CAT_DESC = T2.CAT_DESC ) as Sub 

      PIVOT( MAX(Sub.Disposition)
FOR Sub.Disposition IN ([Had a subsequent within 14 days])) AS PivotTable) as Final) as Calc