首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL总结大厂真题-查询每个用户一条最后一条记录

1.题目 现有一张订单表 t_order 有订单ID、用户ID、商品ID、购买商品数量、购买时间,请查询出每个用户一条记录和最后一条记录。...| 1 | 2023-03-13 11:55:00 | 2.分析 获取记录,一般都会用到开窗函数,本题也是如此,row_number(); 本题特殊之处在于,同一个规则,两种不同排序方式...;一种解决方案是union all,另外一种方式是,直接开窗两次获得两个不同字段,然后使用or获取最后结果。...两种方案得出结果不同,因为如果存在用户只有一条记录,则第一种解决方案会有两相同记录(当然,如果使用union可以避免),第二种方法则直接去重了; 个人不是很喜欢这个题目,不知道具体考点,题目还容易有歧义...purchase_time desc) as desc_rn from t_order ) t2 where t2.desc_rn =1 结果 使用union替代union all结果

29510

如何正确使用一条SQL删除重复数据

数据库中表存在重复数据,需要清理重复数据,清理后保留其中一条情况是比较常见需求,如何通过1SQL准确删除数据呢? 1....','b',40, '2022-05-24 18:00:46'),('r','f',40, '2022-05-24 18:00:46'); 1.3 查看重复数据 例如c1,c2 这2个字段组合作为唯一条件...如何删除重复数据 2.1 方案一 很多研发同学习惯思路如下: 先查出重复记录(使用in) 再查出在重复记录但id不在每组id最大值记录 直接将select 改为delete进行删除 查询SQL...推荐写法 基于以上情况,使用单SQL删除方式如下: 查询SQL: SELECT a.* FROM test a , (SELECT c1,c2,MAX(id)id FROM test...FROM test GROUP BY c1,c2 HAVING COUNT(*)>1)b WHERE a.c1=b.c1 AND a.c2=b.c2 AND a.id b.id 结果:

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

一条查询SQL是如何执行?更新、新增、删除呢?

大部分朋友估计都只知道写sql然后执行,但是并不知道MySQL背后到底是怎么实现。 八股文中也有这么一道题:在MySQL中,一条SQL到底是如何执行?...下面举两个例子: 1 、当我们对多张表进行关联查询时候,以哪个表数据作为基准表。 2 、当我们一条SQL中,如果有多个索引可以使用时候,到底选择哪个所以?...为什么我们修改了表存储引擎,操作方式不需要做任何改变?因为不同功能存储引擎实现 API 是相同最后把数据返回给客户端 回顾 回答文章开头,面试官:一条查询SQL在MySQL中是如何执行?...以上就是一条查询SQL在MySQL中执行过程。 下面来聊聊一句更新、删除、新增执行过程。...其实,看过MyBatis源码朋友都知道,最后只有query和update两种,所以,我们可以把更新、删除和新增归纳为一种update。

28210

消息已读回执(这个diao),究竟是推还是拉?

群成员表:记录群里成员,以及每个成员收到最后一条消息。...group_users(gid, uid, last_ack_msgid); 各字段含义为:群ID,群成员UID,群成员最后收到一条消息ID。...核心问题3:如何保证接收方一定收到群消息? 答:各个收到消息后,要修改各群成员last_ack_msgid,以告诉系统,这一条消息确认收到了。...答:回执数据不是核心数据 已读消息,可以进行物理删除,而不是标记删除 超过N长时间回执,归档或者删除掉 四、总结 对于群消息已读回执,一般来说: 如果发送方在线,会实时被推送已读回执 如果发送方不在线...,会在下次在线时拉取已读回执 如果要对进行优化,可以: 接收方累计收到N消息再批量ack 发送方轮询拉取已读回执 物理删除已读回执数据,定时删除或归档非核心历史数据 推送还是拉取?

1.5K30

群聊比单聊,凭什么复杂这么多?

msg_detail; 步骤5:最后应用层ACK; 步骤6:server收到应用层ACK才能删除离线消息表里msg_id; 如果拉取了消息,却没来得及应用层ACK,会收到重复消息么?...对于离线一条消息,虽然只存储了msg_id,但是每个用户一条离线消息都将在数据库中保存一条记录,有没有办法减少离线消息记录数呢?...对于一个群用户,在ta登出后离线期间内,肯定是所有的群消息都没有收到,完全不用对所有的每一条离线消息存储一个离线msg_id,而只需要存储最近一条拉取到离线消息time(或者msg_id),下次登录时拉取在那之后所有群消息即可...群成员表,增加一个属性: t_group_users(group_id, user_id, last_ack_msg_id) 画外音:用来描述一个群里有多少成员,以及每个成员最后一条ack消息msg_id...如果每条群消息都ACK,确实会给服务器造成巨大冲击,为了减少ACK请求量,可以批量ACK,批量ACK方式又有两种方式: (1)每收到N消息ACK一次,这样请求量就降低为原来1/N了; (2)每隔时间间隔

62820

IM群聊消息已读回执功能该怎么实现?

群成员表:记录群里成员,以及每个成员收到最后一条消息 group_users(gid, uid, last_ack_msgid); 各字段含义为:群ID,群成员UID,群成员最后收到一条消息...那么,群用户每发送一条消息,会有: 40个消息,通知给群友; 40个ack修改last_ack_msgid,发给服务端; 40个已读回执,通知给发送方。 可见,其消息风暴扩散系数非常之大。...答:其实不需要,可以批量ack,累计收到N消息(例如10),再向服务器发送一次last_ack_msgid修改请求,同时修改这个请求之前所有请求已读回执,这样就能将40个发送给服务端ack请求量...答:回执数据不是核心数据 已读消息,可以进行物理删除,而不是标记删除; 超过N长时间回执,归档或者删除掉。...如果要对进行优化,可以: 接收方累计收到N消息再批量ack; 发送方轮询拉取已读回执。 物理删除已读回执数据,定时删除或归档非核心历史数据。

4.8K20

关于“Python”核心知识点整理大全5

假设列表中摩托车是按购买时间存储,就可使用方法 pop()打印一条消息,指出最后购买是哪款摩托车: motorcycles = ['honda', 'yamaha', 'suzuki'] last_owned...首先,我们弹出了列表中第一款摩托车(见1),然后打印了一条有关这辆摩托车消息 (见2)。...下面删除值'ducati',并打印一 消息,指出要将其从列表中删除原因: 3 章 列表简介 1 motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati...最后,值'ducati'已经从列表中删除, 但它还存储在变量too_expensive中(见4),让我们能够打印一条消息,指出将'ducati'从列表 motorcycles中删除原因: ['honda...[-1]) 列表motorcycles不包含任何元素,因此Python返回一条索引错误消息: Traceback (most recent call last): File "motorcyles.py

11610

RabbitMQ实战-高效部署分布式消息队列

不过必须先建立一条信道(channel) 5.在应用程序和Rabbit代理服务器之间创建一条TCP连接。一旦TCP连接找开(通过了认证),应用程序就可以创建一条AMQP信道。...,并被消费者接收;绑定决定了消息如何从路由器路由到特定队列 2.队列就如同具名邮箱,消息最终达到队列中并等待消费,消费者通过以下两种方式从特定队列中接收消息: 通过AMQPbasic.consume...消费者通过确认命令告诉RabbitMQ它已经正确地接收了消息,同时RabbitMQ才能安全地把消息从队列中删除 5.如果消费者收到一条消息,然后确认之前从Rabbit断开连接(或者从队列上取消订阅),RabbitMQ...到达持久化队列 3.确保持久性消息能恢复方式是,将它们写入磁盘上一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit会在消息提交到日志文件后才发送响应,之后这条消息如果路由到了非持久队列的话...):以发生事件描述 3.RabbitMQ使用“.”作为标记中不同部分分隔符;no_ack=false告诉RabbitMQ要显示确认收到消息,这将暂停从队列发送新消息过来,直到收到最后一条消息处理完成并发送确认消息为止

1.1K20

如何在MQ中实现支持任意延迟消息

固定Level含义是延迟是特定级别的,比如支持3秒、5秒Level,那么用户只能发送3秒延迟或者5秒延迟,不能发送8秒延迟消息。...比如用户先发了一条延迟1分钟消息,一秒后发了一条延迟3秒消息,显然延迟3秒消息需要先被投递出去。那么服务端在收到消息后需要对消息进行排序后再投递出去。...: 先发一条level是5s消息,再发一条level是3s消息,因为他们会属于不同ScheduleQueue所以投递顺序能保持正确 如果先后发两level相同消息,那么他们处于同一个ConsumeQueue...如果用户先发了延迟9秒消息再发了延迟1秒消息,他们在一个链表中所以延迟1秒消息会需要等待延迟9秒消息先投递。显然这是不能接受,那么如何解决这个问题?...到此为止就只剩下一个问题,如何保存30天数据? CommitLog保存超长延迟数据 CommitLog是有时效性,比如在我们只保存最近7天消息,过期数据将被删除

5.9K50

03.理解RabbitMQ消息通信中基本概念

生产者把消息发布到交换机上;消息最终达到队列,并被消费者接收;绑定决定了消息如何从路由器路由到特定队列。我们在研究交换机和绑定之前,需要先理解队列概念和工作原理。 ? 队列就如同具名邮箱。...消息最终到达队列中并等待消费。那么消费者是如何特定队列中接收消息呢? 消费者主要通过两种方式从特定队列中接收消息。 (1)通过AMQPbasic.consume命令订阅。...当消费者确认接收到了消息后,Rabbit将会把消息从队列中删除。 你可能注意到了,刚才提到了对消息进行确认。是的,消费者接收到一条消息都必须进行确认。...这是因为在上一条消息被确认之前,Rabbit会认为这个消费者并没有准备好接收下一条消息。 在收到消息后,如果你想要明确拒绝而不是确认收到该消息的话,该如何做呢?...队列是Rabbit中消息最后终点,除非消息进入了“黑洞”。 我们了解了队列之后,那么消息又是如何到达队列呢?接下来,让我们认识一下AMQP交换机和绑定吧。

62720

消息这么复杂,怎么能做到不丢不重?

对应到群离线消息拉取也一样: 步骤1:先拉取msg_id 步骤3:再拉取msg_detail 步骤5:最后应用层ACK 步骤6:server收到应用层ACK才能删除离线消息表里msg_id 存在问题...回答:会,可以在客户端去重,对于重复msg_id,对用户不展现,从而不影响用户体验 (2)对于离线一条消息,虽然只存储了msg_id,但是每个用户一条离线消息都将在数据库中保存一条记录,有没有办法减少离线消息记录数呢...【群消息优化3:离线消息表】 离线消息优化 其实,对于一个群用户,在ta登出后离线期间内,肯定是所有的群消息都没有收到,完全不用对所有的每一条离线消息存储一个离线msg_id,而只需要存储最近一条拉取到离线消息...time(或者msg_id),下次登录时拉取在那之后所有群消息即可,而完全没有必要存储每个人未拉取到离线消息msg_id 群成员表:用来描述一个群里有多少成员,以及每个成员最后一条ack消息msg_id...批量ACK方式又有两种: (1)每收到N消息ACK一次,这样请求量就降低为原来1/N了 (2)每隔时间间隔T进行一次群消息ACK,也能达到类似的效果 新问题 批量ACK有可能导致:还没有来得及

1.5K70

Web网站通知系统设计

1)合并周期: 固定时间内消息全部汇总(24小时内/30天等); 无固定时间(只要未处理/未读即汇总) 当然一般都组合着用:合并24小时内未处理消息 2)分类合并 同种类进行合并(如n留言合并为...1) 同一发起人合并(如张三给你发来n私信) 同一时间周期合并(如24小时共收到n评论) (二)通知分发 通知按照规则汇总完成后,系统将其通过通知管道推送到用户,以便用户处理。...noticezhuangtai.png 有几种情况需要变通处理: 若用户未读信息较多(m=100),但第一页列表只能显示(n=10)的话,那未读数字即为m-n=90; 某些产品会将点击等同于已读...删除用户删除消息。...facebooknoticeste.png 2、增加屏蔽功能 消息屏蔽功能在业务上应该属于第一条中通知类型管理,当业务模块较多且之前关联分散时,或者开放平台功能接入第三方应用通知时,可使用屏蔽功能

6.6K41

想查看微信好友撤回消息?Python帮你搞定

3、如何发送消息给好友 如何发送一条消息给指定好友呢?...() 运行程序,我们撤回一条消息测试一下,输出结果如下: .........这里截取了部分内容,会发现,撤回消息文本内容为"你撤回了一条消息",所以要想知道好友是否撤回了消息就非常简单了,判断msg['Text'] == '你撤回了一条消息'即可。...send_msg = '【发送人:】' + fromUser + '\n' + '发送时间:' + dt + '\n' + '撤回了一条语音' itchat.send...说说我遇到一些坑 这个程序说它难,其实并不难,但我也在编写过程中遇到了一些坑,一开始我是一条消息一条消息地进行测试,发现程序是正常,但我连续撤回几条消息,却发现程序出现了Bug。

2.8K31

想查看微信好友撤回消息?Python帮你搞定

3、如何发送消息给好友 如何发送一条消息给指定好友呢?...() 运行程序,我们撤回一条消息测试一下,输出结果如下: .........这里截取了部分内容,会发现,撤回消息文本内容为"你撤回了一条消息",所以要想知道好友是否撤回了消息就非常简单了,判断msg['Text'] == '你撤回了一条消息'即可。...send_msg = '【发送人:】' + fromUser + '\n' + '发送时间:' + dt + '\n' + '撤回了一条语音' itchat.send...说说我遇到一些坑 这个程序说它难,其实并不难,但我也在编写过程中遇到了一些坑,一开始我是一条消息一条消息地进行测试,发现程序是正常,但我连续撤回几条消息,却发现程序出现了Bug。

1.1K20

kafka使用

payload : n bytes 这个log entries并非由一个文件构成,而是分成多个segment,每个segment以该segment第一条消息offset命名并以“.kafka...正常情况下Consumer会在消费完一条消息后递增该offset。当然,Consumer也可将offset设成一个较小值,重新消费一些消息。...在发送一条消息时,可以指定这条消息key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Parition。...使用Consumer high level API时,同一Topic一条消息只能被同一个Consumer Group内一个Consumer消费,但多个Consumer Group可同时消费这一消息。...在很多使用场景下,消息都有一个主键,所以消息处理往往具有幂等性,即多次处理这一条消息跟只处理一次是等效,那就可以认为是Exactly once。

58331

从演进式角度看消息队列

如果对某个list并发读写非常高,就产生了无法解决热key,严重可能导致系统崩溃。 没有确认机制:每当执行rpop消费一条数据,那条消息就被从list中永久删除了。...通过引入消费组概念,就可以非常容易地支持多业务方同时消费一个topic,也就是说所谓1-N“广播”,一条消息广播给N个订阅方。 最后,通过游标也很容易实现重新消费。...我们再把问题简化一下,假如生产者生产消息在topicA-partition-0.log中一条消息占一行,很快这个文件就到200G了。现在告诉你,这个文件前x行失效了,你应该怎么删除呢?...这样做好处是,当segment中所有消息都过期时,可以很容易地直接删除整个文件。而由于segment中消息是有序,看是否都过期就看最后一条是否过期就行了。 1....所谓稀疏索引就是并非所有消息都会在index文件中记录它position,每间隔多少消息记录一条,比如每间隔10消息记录一条offset-position: offset position 0 0

72330

Redis、Kafka 和 Pulsar 消息队列对比

如果对某个list并发读写非常高,就产生了无法解决热key,严重可能导致系统崩溃。 没有确认机制:每当执行rpop消费一条数据,那条消息就被从list中永久删除了。...通过引入消费组概念,就可以非常容易地支持多业务方同时消费一个topic,也就是说所谓1-N“广播”,一条消息广播给N个订阅方。 最后,通过游标也很容易实现重新消费。...我们再把问题简化一下,假如生产者生产消息在topicA-partition-0.log中一条消息占一行,很快这个文件就到200G了。现在告诉你,这个文件前x行失效了,你应该怎么删除呢?...这样做好处是,当segment中所有消息都过期时,可以很容易地直接删除整个文件。而由于segment中消息是有序,看是否都过期就看最后一条是否过期就行了。 1....所谓稀疏索引就是并非所有消息都会在index文件中记录它position,每间隔多少消息记录一条,比如每间隔10消息记录一条offset-position: offset position 0 0

69020

【Kafka】(一)Kafka简介

1.3、点对点消息传递模式 在点对点消息系统中,消息持久化到一个队列中。此时,将有一个或多个消费者消费队列中数据。但是一条消息只能被消费一次。...这种架构描述示意图如下: 生产者发送一条消息到 queue,只有一个消费者能收到。 1.4、发布-订阅消息传递模式 在发布 – 订阅消息系统中,消息被持久化到一个 topic 中。...与点对点消息系统不同是,消费者可以订阅一个或多个 topic,消费者可以消费该 topic 中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。...任何发布到此 partition 消息都会被直接追加到 log 文件尾部,每条消息在文件中位置称为 offset(偏移量),offset 为一个 long 型数字,它是唯一标记一条消息。...它唯一标记一条消息。kafka 并没有提供其他额外索引机制来存储 offset,因为在 kafka 中几乎不允许对消息进行 “随机读写”。

2.1K20

刨根问底 Kafka,面试过程真好使

18、Consumer 如何消费指定分区消息 Cosumer 消费消息时,想Broker 发出 fetch 请求去消费特定分区消息,Consumer 可以通过指定消息在日志中偏移量 offset,就可以从这个位置开始消息消息...-1: Leader 接收到消息之后,还必须要求ISR列表里跟Leader保持同步那些Follower都确认消息已同步,Producer 才发送下一条(批)Message。...如果大小大于1GB时,会滚动一个新Segment并且以上一个Segment最后一条消息偏移量命名。...36、Kafka 中如何进行主从同步 Kafka动态维护了一个同步状态副本集合(a set of In-SyncReplicas),简称ISR,在这个集合中结点都是和Leader保持高度一致,任何一条消息只有被这个集合中每个结点读取并追加到日志中...支持 eexactly-once 语义 支持一次处理一条记录,实现 ms 级延迟 39、消费者故障,出现活锁问题如何解决 活锁概念:消费者持续维持心跳,但没有进行消息处理。

46530
领券