mysql - Mysql:根据最近的时间戳查询连接表数据
问题描述
我在 Mysql 中有表,我需要能够将基于最近时间戳的数据与匹配的行 [可能早于或等于或大于基于用户名的另一行的时间戳 [但最近]]。
这是示例数据 Mysql 表:
+----+----------+---------+----------+---------------------+
| Id | userName | Browser | Platform | TS |
+----+----------+---------+----------+---------------------+
| 1 | abc | Firefox | NULL | 2006-10-05 11:55:45 |
| 2 | xyz | Chrome | NULL | 2007-10-07 12:34:17 |
| 3 | mnp | Safari | NULL | 2008-10-09 08:19:37 |
| 4 | abc | Safari | NULL | 2010-10-13 04:28:14 |
| 5 | abc | NULL | Windows | 2006-01-01 12:02:45 |
| 6 | xyz | NULL | Linux | 2007-01-01 12:01:20 |
| 7 | mnp | NULL | MAC | 2008-01-01 12:02:29 |
| 8 | abc | NULL | MAC | 2010-03-09 13:06:59 |
+----+----------+---------+----------+---------------------+
我需要如下输出:
+----+----------+---------+----------+---------------------+
| Id | userName | Browser | Platform | TS |
+----+----------+---------+----------+---------------------+
| 1 | abc | Firefox | Windows | 2006-10-05 11:55:45 |
| 2 | xyz | Chrome | Linux | 2007-10-07 12:34:17 |
| 3 | mnp | Safari | MAC | 2008-10-09 08:19:37 |
| 4 | abc | Safari | MAC | 2010-10-13 04:28:14 |
| 5 | abc | Firefox | Windows | 2006-01-01 12:02:45 |
| 6 | xyz | Chrome | Linux | 2007-01-01 12:01:20 |
| 7 | mnp | Safari | MAC | 2008-01-01 12:02:29 |
| 8 | abc | Safari | MAC | 2010-03-09 13:06:59 |
+----+----------+---------+----------+---------------------+
任何人都可以建议获得所需输出所需的 mysql 查询吗
解决方案
如果你有 MySQL v8 或 MariaDb,它支持lead() over()
CREATE TABLE mytable( Id INT ,userName VARCHAR(10) ,Browser VARCHAR(9) ,Platform VARCHAR(10) ,TS timestamp );
INSERT INTO mytable(Id,userName,Browser,Platform,TS) VALUES > > > > > (1,'abc','Firefox',NULL,'2006-10-05 11:55:45'); , (2,'xyz','Chrome',NULL,'2007-10-07 12:34:17'); , (3,'mnp','Safari',NULL,'2008-10-09 08:19:37'); , (4,'abc','Safari',NULL,'2010-10-13 04:28:14') , (5,'abc',NULL,'Windows','2006-01-01 12:02:45') , (6,'xyz',NULL,'Linux','2007-01-01 12:01:20') , (7,'mnp',NULL,'MAC','2008-01-01 12:02:29') , (8,'abc',NULL,'MAC','2010-03-09 13:06:59')
with cte as ( select * , coalesce(lead(ts) over(order by ts),current_time) nxt from mytable ) select id , username , coalesce(browser,(select browser from cte where t.ts between cte.ts and cte.nxt limit 1 )) browser , coalesce(platform,(select platform from cte where t.ts between cte.ts and cte.nxt limit 1 )) platform , ts , nxt from cte t
编号 | 用户名 | 浏览器 | 平台 | ts | 下一个 -: | :------- | :-------- | :------- | :----------------- | :----------------- 5 | 美国广播公司 | 空 | 窗户 | 2006-01-01 12:02:45 | 2006-10-05 11:55:45 1 | 美国广播公司 | 火狐 | 窗户 | 2006-10-05 11:55:45 | 2007-01-01 12:01:20 6 | xyz | 火狐 | Linux | 2007-01-01 12:01:20 | 2007-10-07 12:34:17 2 | xyz | 铬 | Linux | 2007-10-07 12:34:17 | 2008-01-01 12:02:29 7 | mnp | 铬 | 麦克 | 2008-01-01 12:02:29 | 2008-10-09 08:19:37 3 | mnp | 野生动物园 | 麦克 | 2008-10-09 08:19:37 | 2010-03-09 13:06:59 8 | 美国广播公司 | 野生动物园 | 麦克 | 2010-03-09 13:06:59 | 2010-10-13 04:28:14 4 | 美国广播公司 | 野生动物园 | 麦克 | 2010-10-13 04:28:14 | 2018-10-02 08:11:44
db<>在这里摆弄
推荐阅读
- c++ - 我似乎无法在任何地方找到直方图排序的时间复杂度?我知道它是桶排序的类型,但确切的时间复杂度是多少?
- jupyter-notebook - 默认启用在 jupyter lab 中显示行号
- reactjs - React - 为什么我们不需要在 React.memo areEqual 上包含使用 prev 状态的方法?
- c++ - 当从另一个线程调用它时,我可以防止存储的 c++ lambda 中的“this”实例指针的失效/破坏吗?
- firebase - 在实现firebase时出现这个错误该怎么办
- android - 排球数据未显示在回收站视图中
- bash - 选择文件时 bash 脚本中的意外标记“(”附近出现语法错误 [扩展]
- arrays - 如何解决 C 中的内存限制
- c++ - 派生类的属性为空
- android - Retorfit 查询参数采用 & 和 ? 一起