本文为您介绍如何利用实时计算获取最新交易记录。

背景

在互联网电商的真实交易记录里,订单交易表里会出现不同时间对一笔订单出现多次操作的记录。比如您修改了购买的数量、退货等一系列的操作,但是商家只想取有效的交易记录。下文为您介绍如何利用实时计算获取最新交易记录。

操作流程

  • 语法
    SELECT col1, col2, col3
    FROM (
      SELECT col1, col2, col3
        ROW_NUMBER() OVER ([PARTITION BY col1[, col2..]]
        ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum
      FROM table_name)
    WHERE rownum <= N [AND conditions]
    						
    参数 说明
    ROW_NUMBER() 计算行号的OVER窗口函数,行号计算从1开始。
    PARTITION BY col1[, col2..] 指定分区的列,可选
    ORDER BY col1 [asc|desc][, col2 [asc|desc]...] 指定排序的列,可以多列不同排序方向。
  • 测试案例
    • 测试数据
      id(BIGINT) TIME(VARCHAR) VALUE(BIGINT)
      1 1517898096 5
      1 1517887296 44
      1 1517872896 32
      2 1517872896 10
    • 测试语句
      create table source_table (
        id      BIGINT,
        `TIME`  VARCHAR,
        `VALUE` BIGINT
      )with(
        type='datahub',
        endPoint='yourEndpointURL',
        project='yourProjectName',
        topic='yourTableName',
        accessId='yourAccessId',
        accessKey='yourAccessSecret'
      );
      CREATE TABLE result_table (
      	 id   BIGINT,
        `TIME`  VARCHAR,
        `VALUE` BIGINT
      ) WITH (
      	type= 'rds',
      	url = 'yourRDSDatabaseURL',
      	userName = 'yourDatabaseName',
      	password = 'yourDatabasePassword',
      	tableName = 'yourTableName'
      );
      INSERT INTO result_table
      SELECT id,`TIME`,`VALUE`
      FROM (
      	SELECT *,
      	   ROW_NUMBER() OVER (PARTITION BY id ORDER BY `TIME` desc) AS rownume
      	FROM 
          source_table
      ) 
      WHERE rownume <= 1                
      ;
      								
    • 测试结果
      id(BIGINT) TIME(VARCHAR) VALUE(BIGINT)
      1 1517898096 5
      2 1517872896 10
  • 难点解析
    SELECT id,`TIME`,`VALUE`
    FROM (
    	SELECT *,
    	   ROW_NUMBER() OVER (PARTITION BY id ORDER BY `TIME` desc) AS rownume
    	FROM 
        source_table
    ) 
    WHERE rownume <= 1 
    						

    在您的订单表里有多个业务时间处理的订单,您只想取最后时间的订单里面的数据,所以您使用row_number() OVER (PARTITION BY id ORDER BY TIME DESC) 表示根据ID分组,在分组内部根据 TIME排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的),这样我们取的就是最后时间的订单里面的数据。

DEMO示例以及源代码

根据上文介绍的最新交易记录获取解决方案,为您创建了一个包含完整链路的DEMO示例,如下。
  • DataHub作为源表
  • RDS作为结果表
DEMO代码完整,您可参考示例代码,注册上下游数据,制定自己的解决方案。点击DEMO代码进行下载。