SQL如果记录等于它前面的记录

SQL如果记录等于它前面的记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图将excel中的一个公式复制到SQL中,我有一个带有地址的客户ID代码列表 我将邮政编码和姓氏连接起来,并按升序排序 我想检查前面的文本字符串是否等于当前字符串 如果是这样的话,我想把前面的ID号放在一个名为new ID的新字段中(在当前记录上),把旧代码放在一个名为Deleted codes的新字段中 基本上,我们有重复的地址,我们想合并到一个客户,但不删除任何数据 新代码公式=IF(M20=M19、O19、A20) 删除的代码公式=IF(N20=O20,“,N20) 这可以在SQL中实

我试图将excel中的一个公式复制到SQL中,我有一个带有地址的客户ID代码列表

我将邮政编码和姓氏连接起来,并按升序排序

我想检查前面的文本字符串是否等于当前字符串

如果是这样的话,我想把前面的ID号放在一个名为new ID的新字段中(在当前记录上),把旧代码放在一个名为Deleted codes的新字段中

基本上,我们有重复的地址,我们想合并到一个客户,但不删除任何数据

新代码公式=IF(M20=M19、O19、A20) 删除的代码公式=IF(N20=O20,“,N20)

这可以在SQL中实现吗

;WITH MyCTE AS
(
    SELECT *, 
           ROW_NUMBER()OVER (ORDER BY TextString) AS rn
    FROM   Table1
)
SELECT T1.TextString AS T1String,
       T2.TextString AS T2String,
       CASE WHEN T1.TextString = T2.TextString THEN T1.ID ELSE '' END AS NewCode,
       CASE WHEN T1.TextString = T2.TextString THEN T2.ID ELSE '' END AS OldCode
FROM   MyCTE T1
       LEFT JOIN MyCTE T2
           ON T1.rn = T2.rn+1

您使用的是什么版本的SQL Server?很抱歉,我使用的是SQL SSMS 2008。如果我们能看到您的表的结构,那会有所帮助。我建议使用densite_rank()而不是row_number(),即:选择densite_rank()over(按文本字符串排序)作为id,*从表1谢谢,你能解释一下它是如何工作的吗,我明白了。我给每一行一个递增的数字,并创建一个cte来保存它们。然后,我使用id和上一个id将cte自身加入。然后,我可以使用上一个id检查当前字符串。在SQL 2012和更高版本中,您可以使用新的LAG函数。感谢您的帮助,代码运行正常,但我收到一条消息,消息说从字符串转换为uniqueidentifier时Msg 8169,级别16,状态2,第1行转换失败。