相似,应该需要根据哪些字段吧根据你贴的示例可以参考一下SELECT MAX(ID),khid,MAX(gxrid),fwdwid,MAX(evmbs) FROM TABLE1 GROUP BY khid,fwdwid

解决方案 »

  1.   

    问题补充:
    这里 两条数据相同的字段是 khid 和 fwdwid
    其它数据 都以 主键ID 大的 为准,进行合并。
      

  2.   

    问题补充:
    这里 两条数据相同的字段是 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
      

  3.   

    问题补充:
    这里 两条数据相同的字段是 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 才对啊。
      

  4.   

    问题补充:
    这里 两条数据相同的字段是 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 才对啊。
    相似的记录会超过两条吗?如果超过两条,那么最大的那条有数据为空的情况,取其它的哪一条呢?
      

  5.   

    问题补充:
    这里 两条数据相同的字段是 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小的那个里面取数据 ,不是空 则 不变
      

  6.   

    你看下这样可以不
    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
      

  7.   

    分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
      

  8.   


    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为原始表
      

  9.   

    给力!
    现在 任务进一步复杂一点。
    表 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 小 的那条数据 
    结束。
      

  10.   

    这不是一样吗?,我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 不就好了吗
      

  11.   

    你参考一下
    --更新
    ;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