当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
- Handwritten digital image recognition convolution neural network
- [design pattern] Chapter 4: Builder mode is not so difficult
- Source code analysis of ThinkPHP framework execution process
- How to do thread dump analysis in Windows Environment
- A solution to the problem that color picker (palette) cannot use shortcut keys in sublime Text3 plug-in
- Mac terminal oh my Zsh + solarized configuration
- [QT] subclass qthread to realize multithreading
- 失业日志 11月5日
- 2020.11.07面试总结(面试12k)
猜你喜欢
捕获冒泡?难道浏览器是鱼吗?
Commodity management system -- integrate warehouse services and obtain warehouse list
商品管理系统——商品新增本地保存实现部分
Looking for better dynamic getter and setter solutions
Five indispensable open source tools for me
Finally, the python project is released as exe executable program process
2020.11.07面试总结(面试12k)
el-table动态表头
Rainbow sorting | Dutch flag problem
重新开始学习离散数学
随机推荐
微信圈子
1486. 数组异或操作
LTM理解及配置笔记记录
1450. 在既定时间做作业的学生人数
上周热点回顾(11.2-11.8)
[Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
RabbitMQ脑裂问题解决方案调查
Recommended tools for Mac
5年程序员面试,常见面试问题解析
JT-day09
Gather in Beijing! Openi / O 2020 Qizhi Developer Conference enters countdown
Mac 必备优质工具推荐
Commodity management system -- the search function of SPU
做用户,绕不开画像!
Start learning discrete mathematics again
2 普通模式
Shoes? Forecasting stock market trends? Taobao second kill? Python means what you want
百亿级数据分表后怎么分页查询?
手写数字图片识别-卷积神经网络
How to query by page after 10 billion level data is divided into tables?