你看下这样可以不 SQL2005+有效 WITH CTE AS( SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs FROM TABLENAME ) SELECT A.ID ,A.khid ,ISNULL(A.gxrid,B.gxrid)gxrid ,A.fwdwid ,ISNULL(A.evmbs,B.evmbs)evmbs FROM CTE A LEFT JOIN CTE B ON B.RN=2 AND A.khid=B.khid AND A.fwdwid=B.fwdwid WHERE A.RN=1
分2组走。 withcte as (select * from (select * ,row_number()over(partition by khid order id) as n from tablename ) as t where n=1) 然后在更新。 update talbename set evmbs=(select evmbs from cte where n=2) where evmbs is null
select id,khid, ISNULL(gxrid,(select max(gxrid) from t t3 where t3.khid=t.khid and t3.fwdwid=t.fwdwid))gxrid ,fwdwid, ISNULL(evmbs,(select max(evmbs) from t t3 where t3.khid=t.khid and t3.fwdwid=t.fwdwid))evmbs from t where exists ( select * from (select MAX(id) maxid from t t2 group by khid,fwdwid) t1 where t.id=t1.maxid ) 试一下,t为原始表
这不是一样吗?,我10楼的方法 就是update 2次。 update talbename set evmbs=(select evmbs from cte where n=2) where evmbs is null update talbename set clrq s=(select clrq from cte where n=2) where clrq is null 不就好了吗
你参考一下 --更新 ;WITH CTE AS( SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs,clrq FROM TABLENAME ) UPDATE A SET gxrid=ISNULL(A.gxrid,B.gxrid),evmbs=ISNULL(A.evmbs,B.evmbs),clrq=ISNULL(A.clrq,B.clrq) --SELECT -- A.ID -- ,A.khid -- ,ISNULL(A.gxrid,B.gxrid)gxrid -- ,A.fwdwid -- ,ISNULL(A.evmbs,B.evmbs)evmbs FROM CTE A LEFT JOIN CTE B ON B.RN=2 AND A.khid=B.khid AND A.fwdwid=B.fwdwid WHERE A.RN=1
go --删除 ;WITH CTE AS( SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs,clrq FROM TABLENAME ) DELETE FROM TABLENAME WHERE ID IN(SELECT ID FROM CTE WHERE RN=2) --查询 SELECT * FROM TABLENAME
这里 两条数据相同的字段是 khid 和 fwdwid
其它数据 都以 主键ID 大的 为准,进行合并。
这里 两条数据相同的字段是 khid 和 fwdwid
其它数据 都以 主键ID 大的 为准,进行合并。ID khid gxrid fwdwid evmbs
6 123 11197 39 122
34 123 38492 39 NULL
的要求输出 结果:34 123 38492 39 122
这样你的结果不就是错的吗 。EVMBS 应该是NULL
这里 两条数据相同的字段是 khid 和 fwdwid
其它数据 都以 主键ID 大的 为准,进行合并。ID khid gxrid fwdwid evmbs
6 123 11197 39 122
34 123 38492 39 NULL
的要求输出 结果:34 123 38492 39 122
这样你的结果不就是错的吗 。EVMBS 应该是NULL
难点就在这里啊,,,需要 把下面那个 空的 填上122 才对啊。
这里 两条数据相同的字段是 khid 和 fwdwid
其它数据 都以 主键ID 大的 为准,进行合并。ID khid gxrid fwdwid evmbs
6 123 11197 39 122
34 123 38492 39 NULL
的要求输出 结果:34 123 38492 39 122
这样你的结果不就是错的吗 。EVMBS 应该是NULL
难点就在这里啊,,,需要 把下面那个 空的 填上122 才对啊。
相似的记录会超过两条吗?如果超过两条,那么最大的那条有数据为空的情况,取其它的哪一条呢?
这里 两条数据相同的字段是 khid 和 fwdwid
其它数据 都以 主键ID 大的 为准,进行合并。ID khid gxrid fwdwid evmbs
6 123 11197 39 122
34 123 38492 39 NULL
的要求输出 结果:34 123 38492 39 122
这样你的结果不就是错的吗 。EVMBS 应该是NULL
难点就在这里啊,,,需要 把下面那个 空的 填上122 才对啊。
相似的记录会超过两条吗?如果超过两条,那么最大的那条有数据为空的情况,取其它的哪一条呢?
相似的只有两条 以ID最大的那个 为准, 最大的那个为 空,则 从ID小的那个里面取数据 ,不是空 则 不变
SQL2005+有效
WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs FROM TABLENAME
)
SELECT
A.ID
,A.khid
,ISNULL(A.gxrid,B.gxrid)gxrid
,A.fwdwid
,ISNULL(A.evmbs,B.evmbs)evmbs
FROM
CTE A
LEFT JOIN CTE B ON B.RN=2 AND A.khid=B.khid AND A.fwdwid=B.fwdwid
WHERE
A.RN=1
withcte as
(select * from (select * ,row_number()over(partition by khid order id) as n from tablename ) as t
where n=1)
然后在更新。
update talbename set evmbs=(select evmbs from cte where n=2)
where evmbs is null
select id,khid,
ISNULL(gxrid,(select max(gxrid) from t t3 where t3.khid=t.khid and t3.fwdwid=t.fwdwid))gxrid
,fwdwid,
ISNULL(evmbs,(select max(evmbs) from t t3 where t3.khid=t.khid and t3.fwdwid=t.fwdwid))evmbs
from t
where exists
(
select * from (select MAX(id) maxid from t t2 group by khid,fwdwid) t1 where t.id=t1.maxid
)
试一下,t为原始表
现在 任务进一步复杂一点。
表 T中有如下数据 其中,ID 是主键,自动生成
ID khid gxrid fwdwid evmbs clrq
6 123 11197 39 122 2014-10-11
34 123 38492 39 NULL 2014-10-13(此处有可能为空)
的要求输出 结果:
34 123 38492 39 122 2014-10-13(若是空,则输出 2014-10-11)
然后,删除 ID 小 的那条数据
结束。
update talbename set evmbs=(select evmbs from cte where n=2)
where evmbs is null
update talbename set clrq s=(select clrq from cte where n=2)
where clrq is null 不就好了吗
--更新
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs,clrq FROM TABLENAME
)
UPDATE A
SET gxrid=ISNULL(A.gxrid,B.gxrid),evmbs=ISNULL(A.evmbs,B.evmbs),clrq=ISNULL(A.clrq,B.clrq)
--SELECT
-- A.ID
-- ,A.khid
-- ,ISNULL(A.gxrid,B.gxrid)gxrid
-- ,A.fwdwid
-- ,ISNULL(A.evmbs,B.evmbs)evmbs
FROM
CTE A
LEFT JOIN CTE B ON B.RN=2 AND A.khid=B.khid AND A.fwdwid=B.fwdwid
WHERE
A.RN=1
go
--删除
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY khid,fwdwid ORDER BY ID DESC)RN,ID,khid,gxrid,fwdwid,evmbs,clrq FROM TABLENAME
)
DELETE FROM TABLENAME
WHERE ID IN(SELECT ID FROM CTE WHERE RN=2)
--查询
SELECT * FROM TABLENAME