一、distinct,group by与ROW_Number()窗口函数使用方法

1. Distinct用法:对select 后面所有字段去重,并不能只对一列去重。

(1)当distinct应用到多个字段的时候,distinct必须放在开头,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面

(2)distinct对NULL是不进行过滤的,即返回的结果中是包含NULL值的

(3)聚合函数中的DISTINCT,如 COUNT( ) 会过滤掉为NULL 的项

2.group by用法:对group by 后面所有字段去重,并不能只对一列去重。

3. ROW_Number() over()窗口函数

注意:ROW_Number() over (partition by id order by time DESC) 给每个id加一列按时间倒叙的rank值,取rank=1

select m.id,m.gender,m.age,m.rank

from (select id,gender,age,ROW_Number() over(partition by id order by id) rank

from temp.control_201804to201806

where id!='NA' and gender!='' or age!=''

) m

where m.rank=1

二、案例:

1.表中有两列:id ,superid,按照superid倒序排序选出前100条不同的id,如下:

 

1.方案一:

子查询中对id,superid同时去重,可能存在一个id对应的superid不同,id这一列有重复的id,但 是结果只需要一列不同的id,如果时不限制数量,则可以选择这种方法

%jdbc(hive)
create table temp.match_relation_3M_active_v5 as
select a.id
from (select distinct id,superid
      from temp.match_relation_3M_activ
      order by superid desc
      limit 100
     ) a
group by a.id
注意,对id去重时可以用gruop by 或者distinct id,两者去重后的id排序时一致的,但是加了distinct(group by)后,distinct字段自带排序功能,会先按照distinct后面的字段进行排序,即已经改变了子查询的中order by的排序,但是结果与正确结果中的id是一样的,只是排序不同罢了。
 

方案二:

因为要求按照superid倒序排序选出,而一个id对应的superid不同,必有大有小,选出最大的那一个,即可。 同理若是按照superid正序排列,可以选出最小的一列

        %jdbc(hive)
create table temp.match_relation_3M_active_v7 as
select a.id
from (select id,max(superid) as superid
         from temp.match_relation_3M_active
         group by id
         order by superid desc
         limit 100
      ) a

 

方案三:

首先利用窗口函数ROW_Number() over()窗口函数对id这一列去重,不能用distinct或者group by对id,superid同时去重

%jdbc(hive)
create table temp.match_relation_3M_active_v11 as
select n.id
from (select m.id,superid
          from (select id,superid,ROW_Number() over(partition by id order by id) rank
                    from temp.match_relation_3M_active
                   ) m  
          where m.rank=1
          order by  superid desc
          limit 100
        )n
注意,以下代码中,窗口函数ROW_Number() over()的执行顺序晚于 order by  superid desc,最终的结果并非 superid的倒叙排列的结果
%jdbc(hive)
create table temp.match_relation_3M_active_v9 as
select m.id
from (select id, superid,ROW_Number() over(partition by id order by id) rank
         from temp.match_relation_3M
         order by  superid desc
        ) m
where m.rank=1
group by m.id
limit 100
 

 
 

Hive中笔记 :三种去重方法,distinct,group by与ROW_Number()窗口函数的更多相关文章

  1. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  2. JS中的五种去重方法

    JS中的五种去重方法 第一种方法: 第二种方法:  第三种方法: 第四种方法: 第五种方法:优化遍历数组法 思路:获取没重复的最右一值放入新数组 * 方法的实现代码相当酷炫,* 实现思路:获取没重复的 ...

  3. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

  4. Hive中的三种不同的数据导出方式介绍

    问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...

  5. js oop中的三种继承方法

    JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...

  6. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  7. Hive总结(八)Hive数据导出三种方式

    今天我们再谈谈Hive中的三种不同的数据导出方式. 依据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统. (2).导出到HDFS中: (3).导出到Hive的还有一个表中. 为了避 ...

  8. hive 数据导出三种方式

    今天我们再谈谈Hive中的三种不同的数据导出方式.根据导出的地方不一样,将这些方式分为三种:(1).导出到本地文件系统:(2).导出到HDFS中:(3).导出到Hive的另一个表中.为了避免单纯的文字 ...

  9. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

随机推荐

  1. 网络基础知识 - HTTP协议

    前传:HTTP协议的演变过程 HTTP(HyperText Transfer Protocol)协议是基于TCP的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是 ...

  2. vux环境配置

    第一步 在vue项目中的package.json文件的dependencies中添加下面三行,即安装vux及其相关依赖 "vux":"^2.7.3", &quo ...

  3. Jenkins结合.net平台工具之Nuget

    我们刚刚通过msbuild在Jenkins环境下把一个控制台项目生成exe可执行文件,如果我们引用了nuget包,也能够正常生成,但是我们知道,我们在把项目提交到git或者svn上的时候并不包含这些包 ...

  4. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务 ...

  5. (2)编译安装lamp三部曲之mysql-技术流ken

    简介 采用yum安装lamp简单,快捷,在工作中也得到了普遍应用.但是如果我们需要某些特定模块功能,以及制定安装位置等,就需要用到编译安装了,接下来将编译安装lamp之mysql. mysql的简介网 ...

  6. [转]centos每天自动备份mysql数据库

    本文转自:https://www.cnblogs.com/chongchong88/p/5566645.html #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/s ...

  7. 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。

     对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  8. mybatis_13一级缓存

    1. Mybatis的缓存理解 Mybatis的缓存,包括一级缓存和二级缓存,一级缓存是默认使用的.二级缓存需要手动开启. 一级缓存指的就是sqlsession,在sqlsession中有一个数据区域 ...

  9. Java线程池 Executor框架概述

    线程池的意义 循环利用线程资源,避免重复创建和销毁线程 线程池的任务是异步执行的,只要提交完成就能快速返回,可以提高应用响应性 Java线程池还有一个很重要的意义:Java线程池就是JDK 5 推出的 ...

  10. python文件夹copy器(多进程版)

    本节的练习的要求如下: 输入要拷贝文件夹的文件名称 读取该文件夹下的所有文件 启动5个进程来拷贝文件夹,将拷贝成功的文件名称放入队列中 主进程中显示文件拷贝的进度 代码如下: import multi ...