本文为您介绍如何利用实时计算获取最新交易记录。
背景
在互联网电商的真实交易记录里,订单交易表里会出现不同时间对一笔订单出现多次操作的记录。例如您修改了购买的数量、退货等一系列的操作,但是商家只想获取有效的交易记录。下文为您介绍如何利用实时计算获取最新交易记录。
操作流程
- 语法
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 rownum FROM source_table ) WHERE rownum <= 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 rownum FROM source_table ) WHERE rownum <= 1 ;
在订单表里有多个业务时间处理的订单,如果您只想取最后时间的订单里面的数据,需要使用
row_number() OVER (PARTITION BY id ORDER BY TIME DESC)
表示根据ID分组,在分组内部根据TIME
降序排列。此函数计算的值表示每组内部排序后的顺序编号(组内是连续且唯一的),这样我们取的就是最新时间的订单里面的数据。over窗口函数的使用,详细请参见OVER窗口。
DEMO示例以及源代码
根据上文介绍的最新交易记录获取解决方案,为您创建了一个包含完整链路的DEMO示例:
- DataHub作为源表。
- RDS作为结果表。
在文档使用中是否遇到以下问题
更多建议
匿名提交