[英]How to QUERY top n records of each group within a table?
我有一個日志表,它以 host_name、drive_id 和 process_run_id 作為主鍵。
我需要 MySQL 語句,它將為每個唯一的 host_name 和 drive_id 獲取前 n 個 process_run_ids。
當前表:
|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|
所需的查詢結果(前 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|
試圖 :
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;
感謝@RaymondNijland
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.