• sql三种去重查询 distict、group by 和row_number()over。


    sql三种去重查询

    经常有用到在这里总结一下三种去重查询distict、group by 和row_number()over。

    1、distinct

    表student数据如下

    idnamegenderfraction
    1张三88
    2李四99
    3赵五66
    4张飞88
    5张三99
    6李四857

    查出不重复的name与fraction的值

    select distinct name,fraction from student

    结果:

    张三 88

    李四 99

    赵五 66

    2、group by

    select name,fraction from student grout by name、fraction

    结果如上面的distinct一样

    3、row_number() over

    slq server 通过Row_Number 函数给数据库表的记录进行标号,在使用的时候会跟over子句,而over子句主要用来对表中的记录进行分组和排序

    语法如下:

    ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

    1:Partition BY 用来分组

    2:Order by 用来排序

    接下来用 row_number() over 进行去重。首先用name 进行分组,id进行排序。

    具体SQL 语句如下

    SELECT * FROM (
    select *,ROW_NUMBER() over(partition by name order by id desc) AS rn from userinfo ) AS u WHERE u.rn=1

    结果如下:

    1    张三    男    88
    2    李四    女    99
    3    赵五    男    66
    4    张飞    男    88

    4.思考
    distinct 和group by 的区别:

    (1)distinct常用来查询不重复记录的条数:count(distinct name),group by 常用它来返回不重记录的所有值。

    (2)在使用group by 分组后,在select中可以选择分组字段,和非分组字段的函数值,如 max()、min()、sum、count()等
    distinct 和row_number over()区别:

    (1)distinct 和 row_number over 都可以实现去重功能,而distinct 作用于当行的时候,其"去重" 是去掉表中字段所有重复的数据,作用于多行的时候是,其"去重"所有字段都相同的数据。

    (2)在使用row_number over 子句时候是先分组,然后进行排序,再取出每组的第一条记录"去重"

    参考:https://www.cnblogs.com/171207xiaohutu/p/11520759.html

  • 相关阅读:
    垂直margin为什么会重叠
    forEach()和for/in循环的缺点与for-of循环
    使用CleanWebpackPlugin插件报错原因:CleanWebpackPlugin is not a constructor
    Vue中常用的组件库
    Vue中使用keep-alive优化网页性能
    Vue中router路由异步加载组件-优化性能
    面试题-JS中的作用域相关问题
    JS中的垃圾回收机制
    【转】 SpringMVC详解(三)------基于注解的入门实例
    【转】 SpringMVC详解(二)------详细架构
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14719410.html
Copyright © 2020-2023  润新知