首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用sql,根据条件查找上一行。

使用sql,根据条件查找上一行。
EN

Stack Overflow用户
提问于 2022-04-21 22:27:55
回答 1查看 145关注 0票数 0

我有一个表,用来存储用户不同会话的记录(订阅、取消订阅、离开、在线)。我必须计算每一次会议的持续时间。我可以使用滞后期()函数获得前一行,但是滞后()使用偏移量,而且我不知道偏移量是什么。我必须得到前一行where event NOT IN ('subscribe', 'unsubscribe')。与附件中的图像一样,对于带有事件订阅的第8行,前一行应该是第4行,其中包含事件消失。我正在使用MYSQL的最新版本。

到目前为止,我编写了mysql查询,得到了结果,但是我希望根据条件获得前一行,而不是将一个硬编码的偏移量设置为2中的滞后()函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from (
  select `id`, `user_id`, `event`, `created_at`,
    date(created_at) as date,
    SEC_TO_TIME(TIMESTAMPDIFF(SECOND, created_at, LEAD(created_at) OVER (PARTITION BY user_id ORDER BY created_at))) as duration,
    LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at)  AS previous_event,
    CASE
        WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) = 'away' THEN 'away'
        WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) = 'online' THEN 'online'
        WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) IS NULL THEN 'online'
        ELSE event END as status
    from `user_websocket_events` where event in ('online','away','unsubscribe','subscribe') and created_at between '2022-04-06 00:00:00' and '2022-04-07 23:59:59' and user_id in(19)
  ) as `Developer`
where created_at between '2022-04-06 00:00:00' and '2022-04-06 23:59:59';

#data for testing
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9606, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9609, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9610, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9611, 19, 'away');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9613, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9614, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9616, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9618, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9634, 19, 'online');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9635, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9636, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9637, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9638, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9639, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9640, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9641, 19, 'away');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9642, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9643, 19, 'subscribe');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-22 00:52:35

请参见下一个查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *,
       SUM(event NOT IN ('subscribe', 'unsubscribe')) OVER (ORDER BY id) group_no
FROM user_websocket_events
ORDER BY 1

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=d313c095f5c034a0a03cf70defd8344a

此查询将行集划分为组,每个组从一个不是“订阅”或“取消订阅”的事件开始。

因此,对于任何行,您都可以很容易地找到上一行的id值,其中event NOT IN ('subscribe', 'unsubscribe')具有简单的MIN(id) OVER (PARTITION BY group_no)。当然是非零组号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71964297

复制
相关文章
怎么根据域名查ip?又如何根据ip查域名?
对互联网但凡有点了解的朋友一定都听说过ip和域名这两个词,很多时候我们都会需要用到他们。前者是让我们找到地址的门牌,后者则是让我们快速访问网页的名称。ip和域名是相联系的,一个ip可以有很多域名,但一个域名只有一个ip,所以通过ip或是域名就能够查询到对方。那么,下面就一起来看看怎么根据域名查ip等内容吧。
用户8739990
2021/08/06
16.8K0
怎么根据域名查ip?又如何根据ip查域名?
根据上一行填充本行的空白栏位,SQL处理方式
我在4年多前,写了一篇Excel处理空白Cell的文章,http://www.cnblogs.com/studyzy/archive/2010/04/07/1706203.html,其实在数据库中也会遇到这种情况。对于普通的OLTP系统来说,应该不会出现,主要是在做OLAP,导入外部数据源时,可能导入系统的就是带有空白记录的数据。
深蓝studyzy
2022/06/16
4960
根据上一行填充本行的空白栏位,SQL处理方式
使用SQL语句如何实现条件判断
客户需求是咨询如何用SQL结合decode函数实现条件判断,比如当某一列数值大于500,对应类型“大于500”;当某一列数值小于500,对应类型“小于500”。 实际decode函数无法实现这个功能,实现要用到case when,为此我构造一个简单的示例来直观演示:
Alfred Zhao
2019/05/24
2.4K0
Ext根据条件显示隐藏列
  写在ExtonReady函数里面,并在表格成功渲染之后,可以添加判断是否隐藏或者显示某一列
河岸飞流
2019/08/09
2.7K0
MySQL根据条件返回bool值
有时候我希望从数据库中拉取数据时能够获得一些较为复杂的信息,比如获取活动信息时还想知道当前用户是否参加了活动(需要再做一次查询才能判断),为了简化后台逻辑,避免查询两次获得两组结果再合并,我发现了CASE语句。
gojam
2019/05/14
4.2K0
SQL增删改查
# 创建users表 create table users (user_id int(5) primary key auto_increment, user_name varchar(30) not null, user_sex int(1), user_birthday datetime); # 查询所有数据 select user_id,user_name,user_sex,user_birthday from users; # 查询用户根据用户id select user_id,user_name
暖月寒星
2020/03/11
6810
APK查壳软件(根据so名)
下载完成解压后,在 checkapp\dist 目录下启动 check.exe 文件.
李玺
2021/11/22
1.4K0
APK查壳软件(根据so名)
使用Java根据表名导出与导入Sql
很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。
程序员朱永胜
2023/08/17
2350
使用Java根据表名导出与导入Sql
[代码结构设计]根据不同条件使用不同实现类的业务代码设计
这样大家可能不是太理解。举个例子,现在大街小巷上的商户都采用了聚合支付的支付方式,聚合支付也就是商户柜台前放了一个支持支付宝、微信、京东钱包、银联等等的二维码,用户可以通过任意一款支付APP进行支付。
云枭
2018/11/08
2.3K0
3 - SQL Server 2008 之 使用SQL语句删除约束条件
《3 - SQL Server 2008 之 使用SQL语句删除约束条件》介绍了如何使用SQL语句删除SQL Server 2008中的约束条件。基本语法为ALTER TABLE 表名 DROP CONSTRAINT 约束名1,约束名2……。如果删除一个约束,不需要逗号后的约束名,如果删除两个及两个以上的约束,必须以逗号隔开。例如,删除Employee表中的FK_PersonID外键约束及PK_EmployeeID主键约束的代码为:USE PersonInfo;GO;ALTER TABLE Employee DROP CONSTRAINT FK_PersonID,PK_EmployeeID;GO。该文还介绍了如何利用工具生成SQL语句删除约束条件,以及如何使用视图和T-SQL语句删除约束条件。"
CNXY
2017/12/25
1.5K0
3 - SQL Server 2008 之 使用SQL语句删除约束条件
问与答99:如何根据组合条件求和?
Q:如下图1所示的数据排列,每组数据都由“月份、分类、字母、数值”组成,但是月份在单独的行,其他的数据分布在各行中且存在重复。
fanjy
2021/03/12
2.8K0
mybatis多条件查询sql_sql模糊查询多个条件
步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:在前一步的基础上进行步骤4:模糊查询步骤5:多条件查询
全栈程序员站长
2022/10/03
3.4K0
mybatis多条件查询sql_sql模糊查询多个条件
Spring Boot 2 实战:使用 @Condition 注解来根据条件注入 Bean
我们经常会有根据条件来加载不同的接口。比如你查询目录下文件列表, Windows 下你会用 CMD 的 dir 命令,而 Linux 下你会使用 ls 命令。 熟悉 Spring Boot 自动配置的也知道 Spring Boot 能根据不同的实际情况启用不同的配置。这就是@Conditional注解在发挥作用。 该注解指定了在什么条件下创建 Bean 进行配置。
码农小胖哥
2019/12/10
12K0
软件测试|SQL指定查询条件,WHERE的使用
使用 SQL 从单个表或者多表联合查询数据时,可以使用 WHERE 子句指定查询条件。当给定查询条件时,只有满足条件的数据才会被返回。建议您使用 WHERE 子句来过滤记录,以获取必要的结果集。
霍格沃兹测试开发Muller老师
2023/06/02
9900
根据SQL提炼表信息
在MySQL慢日志通过pt工具解析后有一个小问题,那就是我们很难得到一个完整的table列表,即假设一条SQL语句很长,那么我们其实想知道这条SQL相关的表是哪几个,如果能够很清晰的提炼出来,那么我们要做后续的分析就会锦上添花。
jeanron100
2019/05/08
4780
用 SQL查 Linux日志
它将普通文件或者结果集当作数据库表,几乎支持所有的SQL结构,如WHERE、GROUP BY、JOINS等,支持自动列名和列类型检测,支持跨文件连接查询,这两个后边详细介绍,支持多种编码。
用户7639835
2021/09/01
1.6K0
sql基本增删改查
例:insert into Strdents (姓名,性别,出生日期) values (‘开心朋朋’,’男’,’1980/6/15′)
全栈程序员站长
2022/07/21
5030
R 语言根据条件判断返回ABCD状态
有朋友给我写信,问我R语言的问题,与其回复代码,不如写篇博客,顺便试试CSDN的新模板。
邓飞
2020/09/14
1K0
R 语言根据条件判断返回ABCD状态
SpringBoot根据条件注入Bean@Condition用法
@Condition:这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean!
时光_赌徒
2020/05/25
2.4K0
springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
这个需求应该也比较常见,在不同的条件下创建不同的bean,具体场景很多,能看到这篇的肯定懂我的意思。
天涯泪小武
2019/01/17
8.1K0

相似问题

SQL:内部联接根据条件返回一行

41

SQL查询-根据条件选择一行或另一行

14

SQL查找上一行和当前行之间的差异

33

查(查)查

24

使用SQL根据条件进行排序

223
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文