简体   繁体   English

如何查询表中每个组的前 n 条记录?

[英]How to QUERY top n records of each group within a table?

I have a log table which has host_name, drive_id and process_run_id as primary key.我有一个日志表,它以 host_name、drive_id 和 process_run_id 作为主键。

I need the MySQL statement which will get the top n process_run_ids for each unique host_name and drive_id.我需要 MySQL 语句,它将为每个唯一的 host_name 和 drive_id 获取前 n 个 process_run_ids。

CURRENT TABLE:当前表:

|host_name|drive_id |process_run_id|free_space|
|       A |   C     |          1   |       500|
|       A |   C     |          2   |       500|
|       A |   C     |          3   |       570|
|       A |   C     |          4   |      1000|
|       B |   C     |          1   |       769|
|       B |   C     |          2   |      4167|
|       B |   C     |          3   |      3244|
|       B |   D     |          1   |      7654|
|       B |   D     |          2   |        76|
|       B |   D     |          3   |       435|
|       B |   D     |          4   |       243|
|       C |   C     |          1   |     23443|
|       C |   C     |          2   |      4324|
|       C |   C     |          3   |      1232|
|       C |   C     |          4   |      9777|

DESIRED QUERY RESULT (Top 2):所需的查询结果(前 2 个):

|host_name|drive_id |process_run_id|free_space|
|       A |   C     |          3   |       570|
|       A |   C     |          4   |      1000|
|       B |   C     |          2   |      4167|
|       B |   C     |          3   |      3244|
|       B |   D     |          3   |       435|
|       B |   D     |          4   |       243|
|       C |   C     |          3   |      1232|
|       C |   C     |          4   |      9777|

ATTEMPT :试图 :

SELECT space_free, host_name, drive_id, process_run_id
FROM
(SELECT space_free, host_name, drive_id, process_run_id,
              @host_rank := IF(@current_host = CONCAT(host_name, drive_id), @host_rank + 1, 1) AS host_rank,
              @current_host := CONCAT(host_name, drive_id)
   FROM sandbox_yohal.main_fds_history_list
   ORDER BY host_name, process_run_id DESC
 ) ranked
WHERE host_rank <= 2;
SELECT host_name, drive_id, process_run_id, space_free, space_total, date_processed
FROM
(SELECT host_name, drive_id, process_run_id, space_free, space_total, date_processed,
          @host_rank := IF(@current_host = CONCAT(host_name, drive_id), @host_rank + 1, 1) AS host_rank,
          @current_host := CONCAT(host_name, drive_id)
   FROM main_fds_history_list
CROSS JOIN(SELECT @host_rank := NULL, @current_host := NULL) AS init_user_param 
   ORDER BY CONCAT(host_name, drive_id), process_run_id DESC) ranked
WHERE host_rank <= 2;

Thanks to @RaymondNijland感谢@RaymondNijland

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM