编写SQL查询:按时序匹配连接两表Top5最新时间戳行
需求说明
现有两张表 Table1 和 Table2,均包含 timestamp(时间戳)、query_time(查询时间)列。需要完成以下操作:
- 分别从两张表中取出时间戳最新的前5行,并按
timestamp排序; - 将两表的行按时序一一匹配连接:表1的最新行对应表2的最新行,次新行对应次新行,依此类推。
示例数据
Table1 数据:
timestamp query_time 1 1 2 4 3 6 4 8 5 10
Table2 数据:
timestamp query_time 10 10 20 200 30 300 40 400 50 500
期望连接结果
| t1_timestamp | t1_query_time | t2_timestamp | t2_query_time |
|---|---|---|---|
| 1 | 1 | 10 | 10 |
| 2 | 4 | 20 | 200 |
| 3 | 6 | 30 | 300 |
| 4 | 8 | 40 | 400 |
| 5 | 10 | 50 | 500 |
解决方案
可以通过窗口函数 ROW_NUMBER() 为两张表筛选出的前5行添加序号,再通过序号进行连接,实现行的一一匹配:
WITH t1_top5 AS ( SELECT timestamp AS t1_timestamp, query_time AS t1_query_time, ROW_NUMBER() OVER (ORDER BY timestamp DESC) AS row_num FROM Table1 ORDER BY timestamp DESC LIMIT 5 ), t2_top5 AS ( SELECT timestamp AS t2_timestamp, query_time AS t2_query_time, ROW_NUMBER() OVER (ORDER BY timestamp DESC) AS row_num FROM Table2 ORDER BY timestamp DESC LIMIT 5 ) SELECT t1.t1_timestamp, t1.t1_query_time, t2.t2_timestamp, t2.t2_query_time FROM t1_top5 t1 JOIN t2_top5 t2 ON t1.row_num = t2.row_num ORDER BY t1.row_num DESC;
说明
t1_top5和t2_top5两个公共表表达式分别从两张表中取出时间戳最新的前5行,同时用ROW_NUMBER()按时间戳降序(最新在前)生成序号;- 最后通过序号
row_num将两张表的行一一连接,再按序号降序排列,得到表1最新行对应表2最新行的结果。
内容的提问来源于stack exchange,提问作者hatellla
相关产品推荐
相关产品推荐

