Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Sql Server_Tsql_Sql Server 2012_Window Functions - Fatal编程技术网

Sql 再回头看一次以上的记录滞后

Sql 再回头看一次以上的记录滞后,sql,sql-server,tsql,sql-server-2012,window-functions,Sql,Sql Server,Tsql,Sql Server 2012,Window Functions,我有一个表,可以跟踪不同位置的项目。由于此表由两个独立的系统提供,因此日期可能重叠。让我们把它们称为System1和System2 我使用分区来检查日期是否重叠,但当出现错误的记录不是相邻行时遇到了问题。i、 e.System2中的第一条记录存在于System1中的记录中,因此被丢弃,但是System2中的第二条记录在System2中最后一条记录结束之前开始,或者同样在最后一条记录中 为了解决这个问题,我试图捕获System1中的最后一个结束日期,这样我就可以轻松地对照这个值检查我的日期。我的问

我有一个表,可以跟踪不同位置的项目。由于此表由两个独立的系统提供,因此日期可能重叠。让我们把它们称为System1和System2

我使用分区来检查日期是否重叠,但当出现错误的记录不是相邻行时遇到了问题。i、 e.System2中的第一条记录存在于System1中的记录中,因此被丢弃,但是System2中的第二条记录在System2中最后一条记录结束之前开始,或者同样在最后一条记录中

为了解决这个问题,我试图捕获System1中的最后一个结束日期,这样我就可以轻松地对照这个值检查我的日期。我的问题是我对分区的了解不够,无法做到这一点。我基本上需要一个分区,而不是一个分区。主分区基于PartID,第二个分区基于SysID,我想您甚至可以使用源代码。为了使事情变得整洁,我在下面的示例数据中将唯一的记录id重命名为仅一位数的id

当前代码只是ADTM排序的PartID上的一系列超前/滞后语句分区

样本数据: 对于这些数据,我目前正确地将带有single*的记录标识为错误。但是,带**的错误是一个无法识别的错误,因为它包含在System1的记录3757871中。我需要能够比较ID 6和ID 4的日期,以便识别该故障

Source        SysID     PartID   ID       ADTM                SDTM
System1     A8871247    1661181  1   2014-08-15 11:21   2014-08-15 11:35
*System2    1661181     1661181  2   2014-08-15 11:27   2014-08-19 11:04*
System1     A8871247    1661181  3   2014-08-15 11:35   2014-08-16 22:43
System1     A8871247    1661181  4   2014-08-16 22:43   2014-08-20 15:44
*System2    1661181     1661181  5   2014-08-19 11:04   2014-08-19 11:05*
**System2   1661181     1661181  6   2014-08-19 11:05   2014-08-20 15:30**
System2     1661181     1661181  7   2014-08-20 15:30   2014-08-20 15:44
System2     1661181     1661181  8   2014-08-20 15:44   2014-08-22 11:34
我的最终结果是ID2、5、6和7将被丢弃,ID8将其ADTM更新为ID4的SDTM,以在系统之间创建无缝过渡


基本上,我需要的是
MAX(SDTM)OVER(按ADTM的分区顺序,其中Source='System1')

编辑:我肯定不知道您到底想做什么,但根据您的实际问题,您可以使用以下方法获得前面所有行的MAX-SDTM:

with t2 as (
    select *, max(SDTM) over (partition by PartID order by ADTM, ID) maxSDTM
    from table_name
)
select *, lag(maxSDTM, 1) over (partition by PartID order by ADTM, ID)
from t2
通过对MAX使用over子句,可以将其作为窗口函数,并获得包括当前行在内的所有先前行中最高的SDTM。然后你需要基本上排除当前行,这样你就可以使用LAG来获得之前的最大值。希望这有帮助,对不起,我不明白你的最终目标

Old:我可能不理解这个问题,但如果是这样,我的本能将是使用自连接。以下查询应标识所有错误:

SELECT *
FROM table_name t
JOIN table_name prev
ON (t.ADTM > prev.ADTM OR (t.ADTM = prev.ADTM AND t.ID > prev.ID))
    AND t.SDTM <= prev.SDTM
    AND t.PartID = prev.PartID
选择*
来自表\u name t
联接表\u name prev
打开(t.ADTM>prev.ADTM或(t.ADTM=prev.ADTM和t.ID>prev.ID))

我想确保我理解了完整的目标,为什么ID7不是一个错误-时间在ID 4的时间内。哎呀,你说得对。这也是一个错误。好的,谢谢,我还有另一个问题:如果你有一个部分重叠(假设ID 9有ADTM=2014-08-22 11:30和SDTM=2014-08-23 11:50),那会被认为是一个错误,还是你会将SDTM更新为前一个非错误的最大ADTM(根据示例,2014-08-22 11:34)。不,那就好了。接下来的一个过程将更新ID为9的ADTM,使其为11:34。这似乎不起作用。我真正想要的只是一种在Party上的分区中捕获system1的max sdtm的方法你想要每个Part ID的max sdtm吗?那将是一个分组操作。或者,是否希望按零件ID在当前行之前对每行的最大SDTM进行分区?