Rumah pangkalan data tutorial mysql MySQL分组排序取前N条记录以及生成自动数字序列--groupby后limit外加rownumber_MySQL

MySQL分组排序取前N条记录以及生成自动数字序列--groupby后limit外加rownumber_MySQL

Jun 01, 2016 pm 01:02 PM
urutan nombor

同事提了一个需求,要求按照某列分组,然后将各组的前几条抽取出来。

表结构

1

2

3

4

5

6

7

8

CREATE TABLE `total_freq_ctrl` (

  `time` int(10) unsigned NOT NULL,

  `machine` char(64) NOT NULL,

  `module` char(32) NOT NULL,

  `total_flow` int(10) unsigned NOT NULL,

  `deny_flow` int(10) unsigned NOT NULL,

  PRIMARY KEY (`module`,`machine`,`time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

Salin selepas log masuk
tudou@b2c.xiaomi.com

原sql

1

SELECT machine, deny_flow, total_flow, time FROM total_freq_ctrl A WHERE 1 > (SELECT COUNT(machine) FROM total_freq_ctrl WHERE machine = A.machine AND time > A.time) AND A.module = 'all' ORDER BY A.time desc;

Salin selepas log masuk
只要将 1 改成N就变成取每组的前N条,因为我极其不喜欢子查询,就改就尝试改称join 的方式。

不过这里需要对所有数据进行排序才能确定每组的前N条,所以最佳优化也要全表扫描一次。

首先我要对表中数据进行排序,引入一个变量@row来做rownumber

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

set @row=0;set @mid='';SELECT module, machine, time, @row:=@row+1 rownum FROM total_freq_ctrl order by module,machine,time desc limit 10;

Query OK, 0 rows affected (0.00 sec)

 

Query OK, 0 rows affected (0.00 sec)

 

+--------+---------------+------------+--------+

| module | machine       | time       | rownum |

+--------+---------------+------------+--------+

| all    | 10.201.20.181 | 1409640060 |      1 |

| all    | 10.201.20.181 | 1409640000 |      2 |

| all    | 10.201.20.181 | 1409639940 |      3 |

| all    | 10.201.20.181 | 1409639880 |      4 |

| all    | 10.201.20.97  | 1409640060 |      5 |

| all    | 10.201.20.97  | 1409640000 |      6 |

| all    | 10.201.20.97  | 1409639940 |      7 |

| all    | 10.201.20.97  | 1409639880 |      8 |

| all    | 10.201.20.98  | 1409640060 |      9 |

| all    | 10.201.20.98  | 1409640000 |     10 |

+--------+---------------+------------+--------+

Salin selepas log masuk
rownumber已经出来了,再加一个@mid来进行分组

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

set @row=0;set @mid='';SELECT module, machine, time,case when @mid = machine then @row:=@row+1 else @row:=1 end rownum, @mid:=machine FROM total_freq_ctrl order by module,machine,time desc limit 20;

Query OK, 0 rows affected (0.00 sec)

 

Query OK, 0 rows affected (0.00 sec)

 

+--------+---------------+------------+--------+---------------+

| module | machine       | time       | rownum | @mid:=machine |

+--------+---------------+------------+--------+---------------+

| all    | 10.201.20.181 | 1409640180 |      1 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640120 |      2 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640060 |      3 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640000 |      4 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409639940 |      5 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409639880 |      6 | 10.201.20.181 |

| all    | 10.201.20.97  | 1409640180 |      1 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640120 |      2 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640060 |      3 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640000 |      4 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409639940 |      5 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409639880 |      6 | 10.201.20.97  |

| all    | 10.201.20.98  | 1409640180 |      1 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640120 |      2 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640060 |      3 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640000 |      4 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409639940 |      5 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409639880 |      6 | 10.201.20.98  |

+--------+---------------+------------+--------+---------------+

Salin selepas log masuk
好了,再外面加一层inner join 再对 rownumber 做限制 就可以拿到目标数据了。

tudou@b2c.xiaomi.com

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

set @row=0;set @mid=&#39;&#39;;select a.*,b.rownum from total_freq_ctrl a inner join (SELECT module, machine, time, case when @mid = machine then @row:=@row+1 else @row:=1 end rownum, @mid:=machine mid FROM total_freq_ctrl order by module,machine,time desc) b on b.module=a.module and b.machine=a.machine and b.time=a.time where b.rownum<5;

Query OK, 0 rows affected (0.00 sec)

 

Query OK, 0 rows affected (0.00 sec)

 

+------------+---------------+--------+------------+-----------+--------+

| time       | machine       | module | total_flow | deny_flow | rownum |

+------------+---------------+--------+------------+-----------+--------+

| 1409640360 | 10.201.20.181 | all    |      53937 |      6058 |      1 |

| 1409640300 | 10.201.20.181 | all    |      52588 |      5701 |      2 |

| 1409640240 | 10.201.20.181 | all    |      54254 |      5608 |      3 |

| 1409640180 | 10.201.20.181 | all    |      54684 |      5811 |      4 |

| 1409640360 | 10.201.20.97  | all    |      50679 |      5307 |      1 |

| 1409640300 | 10.201.20.97  | all    |      50472 |      5239 |      2 |

| 1409640240 | 10.201.20.97  | all    |      51586 |      5509 |      3 |

| 1409640180 | 10.201.20.97  | all    |      50794 |      5378 |      4 |

| 1409640360 | 10.201.20.98  | all    |      84747 |      5652 |      1 |

| 1409640300 | 10.201.20.98  | all    |      84506 |      5696 |      2 |

| 1409640240 | 10.201.20.98  | all    |      84982 |      5513 |      3 |

| 1409640180 | 10.201.20.98  | all    |      83997 |      5623 |      4 |

+------------+---------------+--------+------------+-----------+--------+

Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

iOS 17: Cara menukar gaya jam iPhone dalam mod siap sedia iOS 17: Cara menukar gaya jam iPhone dalam mod siap sedia Sep 10, 2023 pm 09:21 PM

Siap sedia ialah mod skrin kunci yang diaktifkan apabila iPhone dipalamkan ke dalam pengecas dan berorientasikan dalam orientasi mendatar (atau landskap). Ia terdiri daripada tiga skrin berbeza, satu daripadanya dipaparkan masa skrin penuh. Teruskan membaca untuk mengetahui cara menukar gaya jam anda. Skrin ketiga StandBy memaparkan masa dan tarikh dalam pelbagai tema yang boleh anda leret secara menegak. Sesetengah tema juga memaparkan maklumat tambahan, seperti suhu atau penggera seterusnya. Jika anda menahan sebarang jam, anda boleh bertukar antara tema yang berbeza, termasuk Digital, Analog, Dunia, Suria dan Terapung. Terapung memaparkan masa dalam nombor gelembung besar dalam warna yang boleh disesuaikan, Solar mempunyai fon yang lebih standard dengan reka bentuk suar matahari dalam warna yang berbeza, dan Dunia memaparkan dunia dengan menyerlahkan

Hasilkan nombor rawak dan rentetan dalam JavaScript Hasilkan nombor rawak dan rentetan dalam JavaScript Sep 02, 2023 am 08:57 AM

Keupayaan untuk menjana nombor rawak atau rentetan alfanumerik berguna dalam banyak situasi. Anda boleh menggunakannya untuk melahirkan musuh atau makanan di lokasi yang berbeza dalam permainan. Anda juga boleh menggunakannya untuk mencadangkan kata laluan rawak kepada pengguna atau mencipta nama fail untuk menyimpan fail. Saya menulis tutorial tentang cara menjana rentetan alfanumerik rawak dalam PHP. Saya berkata pada permulaan siaran ini bahawa beberapa peristiwa benar-benar rawak, dan perkara yang sama berlaku untuk nombor rawak atau penjanaan rentetan. Dalam tutorial ini, saya akan menunjukkan kepada anda cara menjana rentetan alfanumerik pseudo-rawak dalam JavaScript. Menjana Nombor Rawak dalam JavaScript Mari mulakan dengan menjana nombor rawak. Kaedah pertama yang terlintas di fikiran ialah Math.random(), yang mengembalikan apungan

Program C++ untuk membundarkan nombor kepada n tempat perpuluhan Program C++ untuk membundarkan nombor kepada n tempat perpuluhan Sep 12, 2023 pm 05:13 PM

Mewakili nombor sebagai output adalah tugas yang menarik dan penting apabila menulis program dalam mana-mana bahasa. Untuk jenis integer (data jenis pendek, panjang atau sederhana), mudah untuk mewakili nombor sebagai output. Untuk nombor titik terapung (jenis terapung atau berganda), kadangkala kita perlu membundarkannya kepada nombor tempat perpuluhan tertentu. Sebagai contoh, jika kita ingin mewakili 52.24568 sebagai tiga tempat perpuluhan, beberapa prapemprosesan diperlukan. Dalam artikel ini, kami akan memperkenalkan beberapa teknik untuk mewakili nombor titik terapung kepada nombor tempat perpuluhan tertentu dengan membundarkan. Antara pendekatan yang berbeza, adalah penting untuk menggunakan rentetan format seperti C, menggunakan hujah ketepatan dan menggunakan fungsi round() daripada perpustakaan matematik. Mari kita lihat mereka satu persatu. dengan

Cari nombor yang tidak boleh dibahagikan dengan mana-mana nombor dalam julat, menggunakan C++ Cari nombor yang tidak boleh dibahagikan dengan mana-mana nombor dalam julat, menggunakan C++ Sep 13, 2023 pm 09:21 PM

Dalam artikel ini, kita akan membincangkan masalah mencari nombor antara 1 dan n (diberi) yang tidak boleh dibahagikan dengan sebarang nombor antara 2 dan 10. Mari kita fahami ini dengan beberapa contoh - Input:num=14Output:3Penjelasan:Terdapat tiga nombor,1,11,dan13,yang tidak boleh dibahagikan.Input:num=21Output:5Penjelasan:Terdapat nombor1,11,13,17,dan19,yang tidak boleh dibahagi jika

Gunakan C++ untuk menulis kod untuk mencari nombor bukan persegi Nth Gunakan C++ untuk menulis kod untuk mencari nombor bukan persegi Nth Aug 30, 2023 pm 10:41 PM

Kita semua tahu nombor yang bukan kuasa dua mana-mana nombor, seperti 2, 3, 5, 7, 8, dll. Terdapat N nombor bukan persegi, dan adalah mustahil untuk mengetahui setiap nombor. Jadi, dalam artikel ini, kami akan menerangkan segala-galanya tentang nombor tanpa kuasa dua atau bukan kuasa dua dan cara untuk mencari nombor bukan kuasa dua N dalam C++. Nombor bukan kuasa dua ken Jika nombor ialah kuasa dua integer, maka nombor itu dipanggil kuasa dua sempurna. Beberapa contoh nombor kuasa dua sempurna ialah -1isquareof14issquareof29issquareof316issquareof425issquareof5 Jika nombor bukan kuasa dua mana-mana integer, maka nombor itu dipanggil bukan kuasa dua. Sebagai contoh, 15 nombor bukan kuasa dua yang pertama ialah -2,3,5,6,

Nombor dalam Java (dengan 0 awalan dan rentetan) Nombor dalam Java (dengan 0 awalan dan rentetan) Aug 29, 2023 pm 01:45 PM

Nombor dalam Java Adalah penting untuk memahami bahawa kelas nombor bukanlah kelas nyata tetapi kelas abstrak. Di dalamnya, kami mempunyai satu set kelas pembalut yang mentakrifkan fungsinya. Kelas pembalut ini termasuk Integer, Byte, Double, Short, Float dan Long. Anda mungkin perasan bahawa ini adalah jenis data asas yang sama yang kita bincangkan sebelum ini, tetapi ia diwakili sebagai kelas berasingan dengan nama huruf besar untuk mematuhi konvensyen penamaan kelas. Pengkompil secara automatik menukar jenis data primitif kepada objek dan sebaliknya seperti yang diperlukan untuk fungsi atau skop program tertentu, dan kelas berangka adalah sebahagian daripada pakej java.lang. Proses ini dipanggil autoboxing dan unboxing. Dengan memahami sifat abstrak kelas angka dan kelas pembalut yang sepadan, kita boleh

Semak sama ada ia adalah nombor menggunakan fungsi is_numeric() dalam PHP Semak sama ada ia adalah nombor menggunakan fungsi is_numeric() dalam PHP Jun 27, 2023 pm 05:00 PM

Dalam bahasa pengaturcaraan PHP, fungsi is_numeric() ialah fungsi yang sangat biasa digunakan, digunakan untuk menentukan sama ada pembolehubah atau nilai ialah nombor. Dalam pengaturcaraan sebenar, selalunya perlu untuk mengesahkan nilai yang dimasukkan oleh pengguna untuk menentukan sama ada ia adalah jenis angka Dalam kes ini, fungsi is_numeric() boleh digunakan untuk menentukan. 1. Pengenalan kepada fungsi is_numeric() Fungsi is_numeric() ialah fungsi yang digunakan untuk mengesan sama ada pembolehubah atau nilai ialah nombor. Mengembalikan tru jika pembolehubah atau nilai ialah nombor

Mewakili nombor sebagai jumlah bilangan nombor perdana terbesar yang mungkin dalam C++ Mewakili nombor sebagai jumlah bilangan nombor perdana terbesar yang mungkin dalam C++ Aug 31, 2023 pm 04:29 PM

Bincangkan masalah, sebagai contoh, diberi nombor N, kita perlu membahagikan nombor itu kepada nombor perdana maksimumnya, kita boleh menolak nombor perdana daripada N dan kemudian menyemak perbezaan nombor perdana. Jika perbezaannya ialah nombor perdana, maka kita boleh menyatakan N sebagai hasil tambah dua nombor perdana. Tetapi di sini kita perlu

See all articles