去重语句

可以通过多种方式实现去重需求,例如FIRST_VALUE、LAST_VALUE和DISTINCT等。本文介绍如何使用TopN方法实现去重,以及使用过程中的注意事项。

去重的方案通常有两种:

  • 保留第一条。
  • 保留最后一条。

说明 ORDER BY后的时间属性字段必须在源表中定义。

语法

由于SQL没有直接去重的语法,因此我们使用SQL的ROW_NUMBER OVER WINDOW功能实现去重。ROW_NUMBER OVER WINDOW与TopN语句方法类似,可以理解为一种特殊的TopN。

SELECT *
FROM (SELECT *,ROW_NUMBER() OVER ([PARTITION BY col1[, col2..]ORDER BY timeAttributeCol [asc|desc]) AS rownumFROM table_name)
WHERE rownum = 1;

参数说明:

  • ROW_NUMBER():计算行号,行号计算从1开始。
  • PARTITION BY col1[, col2..]:指定分区的列,即去重的Key,也可以不指定分区的列。
  • ORDER BY timeAttributeCol [asc|desc]):指定排序的列,必须是时间属性字段(Processing Time或Event Time)。可以指定为顺序(Keep First Row)或倒序(Keep Last Row)。
  • 外层查询rownum必须为= 1或者<= 1。条件必须是AND,且不能存在Undeterministic的UDF的条件。

如上语法所示,去重需要两层Query:

  • 子查询中:使用ROW_NUMBER(),按照时间属性列对数据进行排序编号。
  • 外层查询中:对排名进行过滤,只取第一条,达到去重的目的。时间列排序方向可以为:
    • 顺序:deduplicate keep first row
    • 倒序:deduplicate keep last row

当排序字段是Processing Time列时,Flink会按系统时间去重,其每次运行结果不确定。当排序字段是Event Time列时,Flink会按业务时间去重,其每次运行结果是确定的。

Deduplicate Keep First Row

保留首行的去重策略,即保留指定Key下第一条出现的数据,之后出现在该Key下的数据会被丢弃掉。因为其State中只存储了Key数据,因此性能较优。示例如下。

SELECT *
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY b ORDER BY proctime) as rowNumFROM T
)
WHERE rowNum = 1;

本例中,将T表按照b字段进行去重,并按照系统时间保留第一条数据。proctime在以上示例中是源表T中的一个具有Processing Time属性的字段。如果您按照系统时间去重,也可以将proctime字段简化成PROCTIME()函数进行调用,可以省略proctime字段的声明。

说明 Blink-3.3.1版本后,FirstRow支持使用Event Time进行开窗,并且不会产生Retraction。

Deduplicate Keep Last Row

注意 LastRow不支持使用Event Time进行开窗。

LastRow的作用也是去重,且只保留该主键下最后一条出现的数据。其性能略胜于LAST_VALUE函数,示例如下。

SELECT *
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY b, d ORDER BY proctime DESC) as rowNumFROM T
)
WHERE rowNum = 1;

FAQ

Q:执行ROW_NUMBER() OVER (PARTITION BY b, d ORDER BY now() as time DESC)语句时,产生如下报错,应该如何处理?

java.lang.RuntimeException: Can not retract a non-existent record:38c30001,1b800000008,1c000000013,85000035343a3731,5d304013.This should never happen.

A:通常有以下两种原因,您可以按照以下方式进行处理:

  • 问题原因:由代码中now()导致。因为TopN不支持非确定性的排序字段,now()每次输出的值不同,所以导致Retraction会找不到之前的值。

    解决方法:Event Time或源表中一个具有Processing Time属性的字段。

  • 问题原因:blink.state.ttl.msstate.backend.niagara.ttl.ms参数值设置过小。

    解决方法:设置过小的TTL参数使用默认配置,或调大参数值。

Blink SQL去重语句相关推荐

  1. Blink SQL DDL语句概述

    DDL语句概述 语法 CREATE TABLE tableName (columnName dataType [, columnName dataType ]*) [ WITH (propertyNa ...

  2. mysql count if语句_COUNT分组条件去重的sql统计语句示例(mysql)

    常规情况下的sql分组统计为: select count(1) from 表 where 条件 group by 字段; 但是有时往往需要添加不同的条件已经去重的统计以上语句就不能满足需求. 解决方案 ...

  3. Blink SQL内置函数大全

    字符串函数 STR_TO_MAP 功能描述 使用listDelimiter将text分隔成K-V对,然后使用keyValueDelimiter分隔每个K-V对,组装成MAP返回.默认listDelim ...

  4. 如何写优雅的SQL原生语句?

    前言: 上一篇讲Mysql基本架构时,以"sql查询语句在MySql架构中具体是怎么执行的" 进行了全面的讲解.知道了sql查询语句在MySql架构中的具体执行流程,但是为了能够更 ...

  5. Database之SQLSever:SQLSever数据库管理学习并深入理解SQL命令语句进阶综合篇《初级→中级→高级》(持续更新,建议收藏)

    Database之SQLSever:SQLSever数据库管理学习并深入理解SQL命令语句进阶综合篇<初级→中级→高级>(持续更新,建议收藏) 目录 SQLSever数据库管理学习并深入理 ...

  6. mysql sql select_mysql SQL Select 语句 简单应用

    一.SQL 简介 1. 什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 2. SQL 能做什么? SQL 面向数据库执行查询 S ...

  7. 灵魂拷问,SQL 查询语句先执行 SELECT吗?

    大家平时和SQL语句打交道的时间肯定不少,有写过简单SQL的,也有为很复杂的业务逻辑的SQL绞尽脑汁的,那我在这里问下大家一个简单的问题:那你知道SQl语句的查询顺序是怎么样的吗? 当我刚看到这个问题 ...

  8. SQLite3中的SQL基本语句和高级语句

    一.SQL基本语句 1. 创建表: 至少需要包含一个表名和一个字段名, 创建基本表: CREATE TABLE stu (id int, name text, score real); 基本表会在数据 ...

  9. sql查询语句 -牛客学习笔记

    sql查询语句 1. limit 使用LIMIT限制结果集 LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数. LIMIT 接受一个或两个数字参数.参数必须是一个整数常量. 如果只给 ...

最新文章

  1. python实现shell_基于 Python 的简易 Shell 实现
  2. 小程序页面跳转传参参数值为url时参数时 会出现丢失
  3. UIView 添加虚线
  4. 运动皮层的树突状钙信号驱动光学脑机接口
  5. bzoj 2435: [Noi2011]道路修建 树上 dp
  6. 修改Cmder命令提示符
  7. TC SRM601
  8. 彩信编辑器之预览功能
  9. 还为重复安装开发环境而烦吗? 这或许是更好的解决方案 —— docker
  10. mxm智能教育机器人无法智能对话_智能教育机器人与玩具的区别在哪里?
  11. openjudge1.2
  12. 华为鸿蒙系统支持什么手机_华为鸿蒙系统支持的手机型号_华为鸿蒙系统最新消息...
  13. java,你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
  14. 数据库DQL单表查询
  15. Python 之圆周率 π 的计算
  16. Java之使用poi导出excel文件,并为特定单元格加锁
  17. Web系统测试中的重点
  18. Python 安装包管理工具 pip
  19. NKOI P3171 逃离迷宫2
  20. 电脑开机提示BOOTMGR is compressed无法启动

热门文章

  1. java messagetag_step tag到quickfix message之间的映射工具
  2. 【周末分享】基因编辑技术的现状与未来
  3. Excel 数据透视表小技巧之 01如何取消透视表最后几行或最后几列的汇总
  4. 第二章计算机应用基础试题答案,职中计算机应用基础第二章测试题及答案(3页)-原创力文档...
  5. 下列不属于计算机图形学的应用的是,计算机图形学试卷
  6. 产品经理(14)#移动端产品设计
  7. EasyExcel 自定义Excel模版数据填充
  8. hgame --Classic Childhood Game(web)
  9. 保研——夏令营预推免全过程经验贴
  10. Windows8.1 preview硬盘安装(图解)