zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Loadrunner的Tuxedo脚本分析,基本流程和基本函数介绍
    安装ArcGIS Server 9.2的一些建议
    .obj,.lib,.dll,.h之间的相互关系
    中国Albers 投影参数设置参考资料
    投影常识
    vc++2005环境中静态调用DLL(隐式)
    设置GDAL_DATA环境变量
    开源代码搜索利器Koders
    更正GDAL_DATA设置一文错误
    2007年的元宵节
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14719410.html
Copyright © 2011-2022 走看看