«

按分组取最新一条记录 - ClickHouse & MySQL

时间:2025-8-26 22:25     作者:wanzi     分类: 数据库


按分组取最新一条记录 - ClickHouse & MySQL

ClickHouse

1. 新版本(ClickHouse 24.0+ 支持 QUALIFY)

SELECT *
FROM ids_data
WHERE event_type = 'alert' AND level IN ('middle','high')
QUALIFY row_number() OVER (PARTITION BY threat_behavior_category ORDER BY timestamp DESC) = 1
ORDER BY timestamp DESC
LIMIT 15 OFFSET 0;

特点

适用场景


2. 老版本(不支持 QUALIFY)

SELECT 
    threat_behavior_category,
    argMax(id, timestamp) AS id,
    argMax(threat_behavior_tactic, timestamp) AS threat_behavior_tactic,
    argMax(level, timestamp) AS level,
    argMax(task_id, timestamp) AS task_id,
    argMax(user_id, timestamp) AS user_id,
    argMax(src_ip, timestamp) AS src_ip,
    argMax(dest_ip, timestamp) AS dest_ip,
    argMax(dest_addr, timestamp) AS dest_addr,
    argMax(dest_port, timestamp) AS dest_port,
    argMax(threat_behavior, timestamp) AS threat_behavior,
    argMax(keyword, timestamp) AS keyword,
    argMax(is_normal, timestamp) AS is_normal,
    max(timestamp) AS timestamp
FROM (
    SELECT *
    FROM ids_data
    WHERE event_type = 'alert' AND level IN ('middle','high')
) AS t
GROUP BY threat_behavior_category
ORDER BY timestamp DESC
LIMIT 15 OFFSET 0;

特点

适用场景


3. 如果不需要分组,只取最近 N 条

SELECT *
FROM ids_data
WHERE event_type = 'alert' AND level IN ('middle','high')
ORDER BY timestamp DESC
LIMIT 15 OFFSET 0;

适用场景


MySQL

1. MySQL 8.0+

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY threat_behavior_category ORDER BY timestamp DESC) AS rn
    FROM ids_data
    WHERE event_type = 'alert' AND level IN ('middle','high')
) t
WHERE t.rn = 1
ORDER BY timestamp DESC
LIMIT 15 OFFSET 0;

特点


2. 老版本 MySQL(无窗口函数)

SELECT t.*
FROM ids_data t
JOIN (
    SELECT threat_behavior_category, MAX(timestamp) AS max_ts
    FROM ids_data
    WHERE event_type = 'alert' AND level IN ('middle','high')
    GROUP BY threat_behavior_category
) m 
ON t.threat_behavior_category = m.threat_behavior_category AND t.timestamp = m.max_ts
ORDER BY t.timestamp DESC
LIMIT 15 OFFSET 0;

特点