SQL查询建议-基于重复项更新记录
我正在寻找一些关于我需要编写的查询的建议,这些建议超出了我目前的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
设备
,使用最早的开始日期
值更新行,以设置结束日期=现在()。每个设备_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为空
最早的是指重复行的前一条记录还是重复行的第一条记录。