当前位置:网站首页>After SQL group query, get the first n records of each group
After SQL group query, get the first n records of each group
2020-11-09 10:51:00 【osc A 3gbrdm】
Catalog
One 、 background
lately , There is a functional requirement in development . The system has an information query module , Ask for information to be presented in card form . Here's the picture :
Show the cards according to the project team , Each project group shows the most read TOP2.
Demand analysis : Group by project group , Then take the top of each group with the most reading 2 strip .
Two 、 Practical analysis
be based on Mysql database
The table definition
1、 The project team :team
id |
Primary key |
name |
Project team name |
2、 Information sheet :info
id |
Primary key |
team_id |
The project team id |
title |
Information name |
pageviews |
Browse volume |
content |
Information content |
info Table data is shown in the figure below :
Let's preview Select Basic knowledge of
Writing order :
select *columns*
from *tables*
where *predicae1*
group by *columns*
having *predicae1*
order by *columns*
limit *start*, *offset*;
Execution order :
from *tables*
where *predicae1*
group by *columns*
having *predicae1*
select *columns*
order by *columns*
limit *start*, *offset*;
count( Field name ) # Returns the total number of records in this field in the table
DISTINCT Field name # Filter duplicate records in the field
First step : First find out the top two readings in the information sheet
info Information table self correlation
SELECT a.*
FROM info a
WHERE (
SELECT count(DISTINCT b.pageviews)
FROM info b
WHERE a.pageviews < b.pageviews AND a.team_id= b.team_id
) < 2 ;
At first glance, it's hard to understand , Here's an example
for instance :
When the amount of reading pageviews a = b = [1,2,3,4]
a.pageviews = 1,b.pageviews It can take [2,3,4],count(DISTINCT b.pageviews) = 3
a.pageviews = 2,b.pageviews It can take [3,4],count(DISTINCT b.pageviews) = 2 # Yes 2 strip , That's the third place
a.pageviews = 3,b.pageviews It can take [4],count(DISTINCT b.pageviews) = 1 # Yes 1 strip , That's the second place
a.pageviews = 4,b.pageviews It can take [],count(DISTINCT b.pageviews) = 0 # Yes 0 strip , That is, the biggest The first name
count(DISTINCT b.pageviews) Represents several values larger than this value
a.team_id= b.team_id Autocorrelation condition , It's about equal to grouping
therefore Top two Equivalent to count(DISTINCT e2.Salary) < 2 , therefore a.pageviews It can be taken as 3、4, Before the assembly 2 high
The second step : Put the watch again team And table info Connect
SELECT a.id, t.NAME, a.team_id, a.pageviews
FROM info a
LEFT JOIN team t ON a.team_id = t.id
WHERE (
SELECT count(DISTINCT b.pageviews)
FROM info b
WHERE a.pageviews < b.pageviews AND a.team_id= b.team_id) < 2
ORDER BY a.team_id, a.pageviews desc
The results are as follows :
There is also a way to understand :
grouping GROUP BY + HAVING, This method can be used to debug the results step by step
SELECT a.id, t.NAME, a.team_id, a.pageviews, COUNT( DISTINCT b.pageviews )
FROM info a
LEFT JOIN info b ON ( a.pageviews < b.pageviews AND a.team_id = b.team_id )
LEFT JOIN team t ON a.team_id = t.id
GROUP BY a.id, t.NAME, a.team_id, a.pageviews
HAVING COUNT( DISTINCT b.pageviews ) < 2
ORDER BY a.team_id, a.pageviews DESC
problem : If the number of readings is the same , It just cracked .
Illustrate with examples :
When the amount of reading pageviews a = b = [1,2,2,4]
a.pageviews = 1,b.pageviews It can take [2,2,4],count(DISTINCT b.pageviews) = 3
a.pageviews = 2,b.pageviews It can take [4],count(DISTINCT b.pageviews) = 1 # Yes 1 strip , That is to say, they are tied for the second place
a.pageviews = 2,b.pageviews It can take [4],count(DISTINCT b.pageviews) = 1 # Yes 1 strip , That's the second place
a.pageviews = 4,b.pageviews It can take [],count(DISTINCT b.pageviews) = 0 # Yes 0 strip , That is, the biggest The first name
count(DISTINCT e2.Salary) < 2 , therefore a.pageviews It can be taken as 2、2、4, Before the assembly 2 high , But there are three pieces of data
3、 ... and 、 summary
Demand transformation : We will find the first few in groups , It's self related , There are several numbers larger than this one
In fact, this is similar to LeetCode The difficulty is hard A database title of
185. All the employees with the top three salaries in the Department
Reference resources :
版权声明
本文为[osc A 3gbrdm]所创,转载请带上原文链接,感谢
边栏推荐
- 20201108编程练习——练习3
- WordPress Import 上传的文件尺寸超过php.ini中定义的upload_max_filesize值--&gt;解决方法。
- 推荐系统,深度论文剖析GBDT+LR
- LTM understanding and configuration notes
- Three ways to operate tables in Apache iceberg
- Android 复选框 以及回显
- 失业日志 11月5日
- Using stream to read and write files to process large files
- 1450. 在既定时间做作业的学生人数
- OpenGL ES 框架详细解析(八) —— OpenGL ES 设计指南
猜你喜欢
Dynamo: a typical distributed system analysis
百亿级数据分表后怎么分页查询?
Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
RabbitMQ脑裂问题解决方案调查
一个简单的能力,决定你是否会学习!
程序员的十年之痒
How to do thread dump analysis in Windows Environment
操作系统之bios
彩虹排序 | 荷兰旗问题
[design pattern] Chapter 4: Builder mode is not so difficult
随机推荐
VisualStudio(Mac)安装过程笔记
共创爆款休闲游戏 “2020 Ohayoo游戏开发者沙龙”北京站报名开启
MapStruct 解了对象映射的毒
Talk about my understanding of FAAS with Alibaba cloud FC
Sql分组查询后取每组的前N条记录
Handwritten digital image recognition convolution neural network
2 normal mode
As a user, you can't get rid of the portrait!
配置交换机Trunk接口流量本地优先转发(集群/堆叠)
20201108 programming exercise exercise 3
Recommendation system, in-depth paper analysis gbdt + LR
从实践谈 Ruby 语法上的几个设计不一致带来的问题。
如何保证消息不被重复消费?(如何保证消息消费的幂等性)
Chrome browser engine blink & V8
Review of hot spots of last week (11.2-11.8)
Stack & queue (go) of data structure and algorithm series
商品管理系统——整合仓库服务以及获取仓库列表
商品管理系统——SPU检索功能
Analysis of the source code of ThinkPHP facade
Complete set of linked list operations of data structure and algorithm series (3) (go)