求一相邻数更新的SQL 请高手大神指点 在线等

weixin_42068029 2018-06-06 05:47:32


SELECT * INTO A_Table_Z FROM
(
SELECT 1 AS TID,'1001' AS PIID,'项目1' AS PIName,'2' AS AreaID,'市内' AS AreaName, '2018-01-01' AS LTDate
UNION ALL
SELECT 2 AS TID,'1002' AS PIID,'项目2' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-02' AS LTDate
UNION ALL
SELECT 13 AS TID,'1005' AS PIID,'项目5' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-07' AS LTDate
UNION ALL
SELECT 18 AS TID,'1001' AS PIID,'项目1' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-13' AS LTDate
UNION ALL
SELECT 20 AS TID,'1002' AS PIID,'项目2' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-14' AS LTDate
UNION ALL
SELECT 22 AS TID,'1003' AS PIID,'项目3' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-15' AS LTDate
) AS A

-- 原始数据是这样
TID PIID PIName AreaID AreaName LTDate
1 1001 项目1 2 市内 2018-01-01
2 1002 项目2 2 市内 2018-01-02
13 1005 项目5 2 市内 2018-01-07
18 1001 项目1 2 市内 2018-01-13
20 1002 项目2 2 市内 2018-01-14
22 1003 项目3 2 市内 2018-01-15

-- 更改为 这样的数据
TID PIID PIName AreaID AreaName LTDate
1 1001 项目1 2 市内 2018-01-01
2 1001 项目1 2 市内 2018-01-02
13 1005 项目5 2 市内 2018-01-07
18 1001 项目1 2 市内 2018-01-13
20 1001 项目1 2 市内 2018-01-14
22 1001 项目1 2 市内 2018-01-15
-- --就是将连续俩天或以上的数据 PIID都改为连续天数开头的第一天的PIID。

--我的脚本
UPDATE A_Table_A SET PIID=A.PIID,PIName=A.PIName
FROM (SELECT PIID,PIName,LTDate FROM A_Table_A) AS A
WHERE DATEADD(DAY,1,A_Table_A.LTDate)=A.LTDate

可以写这样只能更新连续两天的数据 两天以上的就不更新了 请高手指点
...全文
878 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2018-06-07
  • 打赏
  • 举报
回复

SELECT * INTO A_Table_Z FROM 
(
 SELECT 1 AS TID,'1001' AS PIID,'项目1' AS PIName,'2' AS AreaID,'市内' AS AreaName, '2018-01-01' AS LTDate 
   UNION ALL
 SELECT 2 AS TID,'1002' AS PIID,'项目2' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-02' AS LTDate 
    UNION ALL
 SELECT 13 AS TID,'1005' AS PIID,'项目5' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-07' AS LTDate 
   UNION ALL
 SELECT 18 AS TID,'1001' AS PIID,'项目1' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-13' AS LTDate 
   UNION ALL
 SELECT 20 AS TID,'1002' AS PIID,'项目2' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-14' AS LTDate  
   UNION ALL
 SELECT 22 AS TID,'1003' AS PIID,'项目3' AS PIName,'2' AS AreaID,'市内' AS AreaName,'2018-01-15' AS LTDate  
) AS A
--测试数据结束


;WITH cte AS (
SELECT *,ROW_NUMBER() OVER(ORDER BY LTDate)-DATEDIFF(DAY,'1900-01-01',LTDate) AS gp 
FROM A_Table_Z
),cte2 AS (
SELECT *,ROW_NUMBER() OVER(PARTITION BY gp ORDER BY ltdate) AS rn FROM cte
)
UPDATE a SET a.piid=b.piid,a.piname=b.piname
FROM cte as a,cte2 AS b
WHERE a.gp=b.gp AND b.rn=1

SELECT  * FROM A_Table_Z


TID         PIID PIName AreaID AreaName LTDate
----------- ---- ------ ------ -------- ----------
1           1001 项目1    2      市内       2018-01-01
2           1001 项目1    2      市内       2018-01-02
13          1005 项目5    2      市内       2018-01-07
18          1001 项目1    2      市内       2018-01-13
20          1001 项目1    2      市内       2018-01-14
22          1001 项目1    2      市内       2018-01-15


RINK_1 2018-06-07
  • 打赏
  • 举报
回复

 
 with cte_1
 as
 (select *,ROW_NUMBER() over (order by LTDate) as seq_1,DATEDIFF(DAY,'1900-01-01',LTDate) as seq_2 from A_Table_Z),
 
cte_2
as
( select *,seq_2-seq_1 as group_char from cte_1) 

update A
set PIID=B.PIID,
    PIName=B.PIName
from cte_2 A
outer apply (select top 1 PIID,PIName from cte_2 where A.group_char=group_char order by LTDate) as B
 

weixin_42068029 2018-06-06
  • 打赏
  • 举报
回复
请高手指点 拜托拜托

34,589

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧