代码之家  ›  专栏  ›  技术社区  ›  demo

从组中排除最小值

  •  0
  • demo  · 技术社区  · 7 年前

    我需要删除此表中的重复项,但左边的行具有min Id

    select min(cr.id)
    from MyTable mt
    group by mt.LocationId, mt.UserName, mt.Date, mt.Rank
    having count(mt.id) > 1
    

    这是从组中选择最小值的查询。。。但不知道如何从带有重复项的查询中排除它们

    select mt.LocationId, mt.UserName, mt.Date, mt.Rank
    from MyTable mt
    group by mt.LocationId, mt.UserName, mt.Date, mt.Rank
    having count(mt.id) > 1
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Valerica    7 年前

    你可以使用 CTE ROW_NUMBER() 这个 ROW_NUMBER() OVER () 函数正在查找具有重复列相同值的行。此列组合的第一个匹配项正在分配一个 rn 第1个,第2个,第3个,依此类推。 Id 升序你将有最小的rn=1所以删除 where rn > 1

    with cte as (
        select
            *
            ,rn = ROW_NUMBER() over (PARTITION BY LocationId, UserName, Date, Rank order by id asc)
        from MyTable 
    )
    delete from cte where rn > 1
    
        2
  •  0
  •   Yogesh Sharma    7 年前

    我会用 row_number() 功能:

    delete mt
    from (select mt.*,
                 row_number() over (partition by mt.LocationId, mt.UserName, mt.Date, mt.Rank order by mt.id) as seq
          from MyTable mt
         ) mt
    where seq > 1;
    
        3
  •  0
  •   Zaynul Abadin Tuhin    7 年前

    你可以用 row_number 窗口函数

    with t1 as
    (
    select * , 
    row_number() over(partition by mt.LocationId, mt.UserName, mt.Date, mt.Rank order by Id) as rn from MyTable mt
    ) delete from t1 where t1.rn!=1
    
        4
  •  0
  •   Fahmi    7 年前

    使用行号()

     delete m from 
     (select mt.id, mt.LocationId, mt.UserName, mt.Date, mt.Rank,
     row_number() over(partion by mt.LocationId, mt.UserName, mt.Date, mt.Rank 
     order by mt.id) as rn
     from MyTable mt) m where rn<>1