SQL查询建议-基于重复项更新记录

SQL查询建议-基于重复项更新记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在寻找一些关于我需要编写的查询的建议,这些建议超出了我目前的SQL技能/能力 逻辑如下: 对于子查询*中的每组重复的设备,使用最早的开始日期值更新行,以设置结束日期=现在()。每个设备_fk,只应保留一条记录,其中日期_end为空 子查询: SELECT map_id, devices_fk, user_fk, date_start, date_end FROM [users_devices_map] WHERE date_end IS NULL

我正在寻找一些关于我需要编写的查询的建议,这些建议超出了我目前的SQL技能/能力

逻辑如下:

对于子查询*中的每组重复的
设备
,使用最早的
开始日期
值更新行,以设置
结束日期=现在()。每个
设备_fk
,只应保留一条记录,其中
日期_end为空

子查询:

SELECT 
    map_id, devices_fk, user_fk, date_start, date_end 
FROM 
    [users_devices_map] 
WHERE 
    date_end IS NULL 
    AND devices_fk IN (SELECT devices_fk 
                       FROM [users_devices_map] 
                       WHERE date_end IS NULL
                       GROUP BY devices_fk 
                       HAVING COUNT(*) > 1)
ORDER BY
    devices_fk ASC, date_start DESC
为了帮助理解我的问题,以下是子查询的输出:

执行上述查询后,子查询不应返回任何结果(即,因为不存在重复的
设备\u fk
,且
为NULL
日期\u end

结束目标是通过为同一设备(
设备
)的最早开始日期(
日期
)设置结束日期(
date\u end
),使每个
设备
)的结束日期(
date\u start
)只有一行
date\u end

提前感谢您抽出时间

试试这个-

;With cteDevicesMap  As
(
      SELECT 
            ROW_NUMBER() OVER (PARTITION BY devices_fk ORDER BY date_start DESC) AS RN
      FROM [users_devices_map]
)
UPDATE [users_devices_map] SET date_end = GETDATE()
FROM cteDevicesMap WHERE RN > 1;
现在检查表中的记录

SELECT * FROM [users_devices_map] WHERE date_end IS NULL

我还没有测试过这个

update a
set a.date_end = b.date_start
from [users_devices_map] a
join (select max(map_id) map_id, devices_fk, min(date_start) date_start from [users_devices_map] 
group by map_id, devices_fk) b on a.map_id <> b.map_id and a.devices_fk = b.devices_fk
where a.date_end is null
更新a
设置a.date\u end=b.date\u start
来自[users\u devices\u map]a
从[users\u devices\u map]中加入(选择最大(映射id)映射id、设备fk、最小(日期开始)日期开始)
按a.map\u id b.map\u id和a.devices\u fk=b.devices\u fk上的映射标识、设备标识b进行分组
其中a.date\u end为空

最早的是指重复行的前一条记录还是重复行的第一条记录。