zoukankan      html  css  js  c++  java
  • SQL数据去重复 Distinct 和 row_number() over()

    Distinct:查询结果中,去掉了重复的行
    1.语法:
         SELECT Distinct列名称 FROM 表名称;
         Distinct 必须放在Select搜索字段的最前面,否则SQL语句会报语法错误。

    2.示例:

    • 2.1简单建立一个表,填入数据,执行SQL: Select * From [BlogDemo].[dbo].[People],结果如下:
      在这里插入图片描述
    • 2.2 单独查询Name字段,执行SQL:Select Name From [BlogDemo].[dbo].[People],结果如下:
      在这里插入图片描述
    • 2.3 上面查询结果的Name中"李丽"出现了3次,可以使用Distinct 关键字去重复,执行SQL:Select distinct Name From [BlogDemo].[dbo].[People],结果如下:
      在这里插入图片描述
    • 2.4 上面查询结果中可以看到,Distinct 关键字去重复的作用实现了。如果在去重复Name的需求下还需要查询其他所有字段,会出现什么结果,执行SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:
      在这里插入图片描述
    • 2.5 可以看到Distinct 关键字去重复作用并没有什么卵用,当 Distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉,下面验证下,在表中在插入一条数据,如下:
      在这里插入图片描述
    • 2.6 新插入数据第8条和第1条数据内容完全相同,再次执行SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:
      在这里插入图片描述
    • 2.7 可以看到第8条数据被去重了,所以:当 Distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉。在我们实际开发中,表中可能含有多条拥有相同某个字段的记录,如同示例中的Name字段,如果我们只需要相同Name的一个数据怎么办呢?


    row_number() over() 函数:对结果集的输出进行编号。返回结果集分区内行的序列号,每个分区的第一行从 1 开始
    1.语法:

    ROW_NUMBER ( )   OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
    

    2.参数:
           PARTITION BY value_expression:将 FROM 子句生成的结果集划分为应用 ROW_NUMBER 函数的分区。 value_expression 指定对结果集进行分区所依据的列。 如果未指定 PARTITION BY,则此函数将查询结果集的所有行视为单个组。 (PARTITION BY作用相似Group By 分组的效果)
           order_by_clause:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 它是必需的。

    3.示例:

    • 3.1 依旧使用上面的People表,先不加PARTITION BY分组的效果,执行SQL:Select *,ROW_NUMBER() OVER(Order By Id) as row From [BlogDemo].[dbo].[People],可以看到查询的结果集有8组,最后一列加入了row字段标识,结果如下:
      在这里插入图片描述
    • 3.2 加入PARTITION BY分组的效果,执行SQL:Select *,ROW_NUMBER() OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].[People],可以看到这次结果集只有4组,Name为"李丽"全部被标识为4组,结果如下:
      在这里插入图片描述
    • 3.3 如果我们只取Name字段相同数据的一组,只要加一个筛选条件分组row为1即可,执行SQL:Select * From (Select *,ROW_NUMBER() OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].[People]) p Where p.row=1,这时候结果集中Name不会出现相同的数据了,结果如下:
      在这里插入图片描述

    总结:
    Distinct 和 row_number() over() 都有将数据去重复的作用,但Distinct 只能作用于单个字段查询结果集去重复,若针对多个字段查询的结果集去重复,需要所有字段都重复才可以去重复。row_number() over() 函数具有分组效果,无论是对于单字段还是多字段查询结果集去重复都可以做到。

  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/wangqilong/p/10088350.html
Copyright © 2011-2022 走看看