用于逐行比较的SQL查询

用于逐行比较的SQL查询,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一张桌子: opendt enddt Id ------------------------------ 2013-01-20 2013-02-20 1 2013-02-20 2014-02-06 1 2013-02-28 NULL 1 理想情况下,对于记录2,我们应该将enddt=2013-02-28,但实际上它是错误的2014-0

我有一张桌子:

        opendt        enddt         Id
        ------------------------------
        2013-01-20    2013-02-20    1
        2013-02-20    2014-02-06    1
        2013-02-28    NULL          1
理想情况下,对于记录2,我们应该将enddt=2013-02-28,但实际上它是错误的2014-02-06。我想找到这样的记录,其中enddt不等于同一ID的下一行opendt。我知道我可以尝试使用临时表来查找。有没有办法在没有临时表的情况下做到这一点?SQL 2012

试试这个

;With CTE as 
    (
        Select *,row_number() over (partition by id order by opendt asc) as rNo from myTable as t1
    )
    select * from CTE as a
    left join CTE as b on a.rNo =b.rNo + 1 and a.id=b.id
    where b.opendt <> a.enddt 
试试这个

;With CTE as 
    (
        Select *,row_number() over (partition by id order by opendt asc) as rNo from myTable as t1
    )
    select * from CTE as a
    left join CTE as b on a.rNo =b.rNo + 1 and a.id=b.id
    where b.opendt <> a.enddt 

您使用的是SQL Server 2012,因此我建议您使用lead:


您使用的是SQL Server 2012,因此我建议您使用lead:


我试图用非CTE的方式来做这件事。我已经使用了子查询,并在代码中标记了它们。我不确定这是不是最好的办法。这个答案与数据库无关

此查询帮助我们选择要更新的数据-

现在我们将使用上面的查询来更新主表-

从这样的选择进行更新的通用查询如下-

update t1
set
t1.enddt = t2.enddt
from mytable as t1
inner join (Something) as t2 -- something is a table or select
on (some-condition)
where (some-column = whatever)
这是最终结果-

示例表和行-


我试图用非CTE的方式来做这件事。我已经使用了子查询,并在代码中标记了它们。我不确定这是不是最好的办法。这个答案与数据库无关

此查询帮助我们选择要更新的数据-

现在我们将使用上面的查询来更新主表-

从这样的选择进行更新的通用查询如下-

update t1
set
t1.enddt = t2.enddt
from mytable as t1
inner join (Something) as t2 -- something is a table or select
on (some-condition)
where (some-column = whatever)
这是最终结果-

示例表和行-


对等等,我正在写SQLServer。你做了什么吗?你使用的是什么SQL Server版本?是的!等等,我正在写SQLServer。你做了什么吗?你使用的是什么SQL Server版本?一个错误更正了,谢谢!现在不在SQl server前面。仍然有错误,请纠正我。我认为您还需要通过ID加入,否则,ID=1的最后一条记录将与ID=2的第一条记录进行比较…最好询问提出问题的用户。它取决于是否为每个ID划分了日期。您所说的可能也是正确的,但它只能由用户决定!从最初的问题来看:我想找到这样的记录,对于相同的IDNo错误,enddt不等于下一行opendt。就是找不到合适的匹配项。盯着代码看久一点,你可能会发现问题。纠正一个错误,谢谢!现在不在SQl server前面。仍然有错误,请纠正我。我认为您还需要通过ID加入,否则,ID=1的最后一条记录将与ID=2的第一条记录进行比较…最好询问提出问题的用户。它取决于是否为每个ID划分了日期。您所说的可能也是正确的,但它只能由用户决定!从最初的问题来看:我想找到这样的记录,对于相同的IDNo错误,enddt不等于下一行opendt。就是找不到合适的匹配项。盯着代码看久一点,你可能会发现问题所在。
update t1
set
t1.enddt = t2.enddt
--select *
from mytable as t1
inner join 
(
select ini.id, 
ini.maxend as opendt, 
fin.opendt as enddt
from
(
select id, MAX(opendt) maxend
from mytable
where enddt is not null
group by id
) as ini -- subquery 1
inner join
(
select id, opendt
from mytable
where enddt is null
) as fin -- subquery 2
on ini.id = fin.id
) as t2
on t1.id = t2.id
and t1.opendt = t2.opendt
CREATE TABLE [dbo].[mytable](
    [opendt] [date] NULL,
    [enddt] [date] NULL,
    [id] [int] NULL
)
GO
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0xA7360B00 AS Date), CAST(0xC6360B00 AS Date), 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0xC6360B00 AS Date), CAST(0x25380B00 AS Date), 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0xCE360B00 AS Date), NULL, 1)
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0x49370B00 AS Date), CAST(0x4D370B00 AS Date), 2)
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0x4D370B00 AS Date), CAST(0x50370B00 AS Date), 2)
INSERT [dbo].[mytable] ([opendt], [enddt], [id]) 
VALUES (CAST(0x57370B00 AS Date), NULL, 2)