zoukankan      html  css  js  c++  java
  • 用CTE结合排名函数rank()删除某列值重复的记录

        

    1.认识排名函数
    --不分组,直接对整张表的某列的值进行排名,并产生一个排名值
    SELECT ROW_NUMBER() OVER(ORDER BY a.Name) AS rowNumber,a.Name FROM dbo.ReplyData a

    --PARTITION BY a.NAME,根据Name字段进行分组,再按num进行排名
    SELECT ROW_NUMBER() OVER(PARTITION BY a.Name ORDER BY Num) AS rowNumber,a.Name,a.Num FROM dbo.ReplyData a

    2.创建测试数据

    CREATE TABLE #tempTable(ID INT IDENTITY(1,1) PRIMARY KEY, Num INT)
    INSERT INTO #tempTable( Num )
    SELECT 2
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 1
    UNION ALL
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 2
    SELECT * FROM #tempTable

    3进入正题

    --删除num重复的记录

    WITH F(id, ranKN)
    AS
    (
    --根据num分组,这里的分组是不会将记录合并的哈(也就是一个分组一个结果),如果一个组
    --如果这个组出现多个记录,那么rank一定也有多个,也就是大于1.
    SELECT ID, RANK() OVER( PARTITION BY Num ORDER BY ID) AS rowNum FROM #tempTable b
    )
    --SELECT * FROM F,delect 的表#tempTable,不能加别名
    DELETE FROM #tempTable WHERE ID IN(
    SELECT h.ID FROM F g
    JOIN #tempTable h ON g.id = h.ID
    AND g.ranKN >1)

    4检验结果
    SELECT * FROM #tempTable

  • 相关阅读:
    总结一下矩阵的基本操作
    洛谷|P4281 [AHOI2008]紧急集合 / 聚会
    CQYZ OJ|Contest 133|祖孙询问
    博客主题分享
    USACO1.1|黑色星期五Friday the Thirteenth
    USACO1.1.2|贪婪的送礼者
    POJ1664|DFS水题
    树状数组的区间查询与区间修改
    N0lP2018爆零记录
    A了一道dijkstra板子
  • 原文地址:https://www.cnblogs.com/Ellfelo/p/CTEandRank.html
Copyright © 2011-2022 走看看