MST

星途 面试题库

面试题:MariaDB中基于用户行为时间序列实现活跃用户统计

现有一个记录用户操作行为的表`user_actions`,字段有`user_id`(用户ID)、`action_time`(操作时间)、`action_type`(操作类型)。要求统计过去7天内,至少有3种不同操作类型的活跃用户数量,并且说明在MariaDB不同版本下,可能会因为函数或特性差异而做出的调整。
40.0万 热度难度
数据库MariaDB

知识考点

AI 面试

面试题答案

一键面试
  1. 在MariaDB较新版本(支持窗口函数等特性)中
WITH UserActionsLast7Days AS (
    SELECT user_id, action_type, action_time
    FROM user_actions
    WHERE action_time >= CURDATE() - INTERVAL 7 DAY
),
UserActionTypeCount AS (
    SELECT user_id, COUNT(DISTINCT action_type) AS action_type_count
    FROM UserActionsLast7Days
    GROUP BY user_id
)
SELECT COUNT(*) AS active_user_count
FROM UserActionTypeCount
WHERE action_type_count >= 3;
  1. 在MariaDB较旧版本(不支持窗口函数等特性)中
SELECT COUNT(*) AS active_user_count
FROM (
    SELECT user_id, COUNT(DISTINCT action_type) AS action_type_count
    FROM user_actions
    WHERE action_time >= CURDATE() - INTERVAL 7 DAY
    GROUP BY user_id
    HAVING action_type_count >= 3
) AS SubQuery;

MariaDB不同版本调整说明

  • 较新版本:可以利用公共表达式(CTE,即WITH子句)使查询结构更清晰,便于理解和维护。窗口函数等特性也可以用于更复杂的分析场景,但在这个简单查询中未涉及。
  • 较旧版本:没有CTE特性,需要将子查询直接嵌套在主查询中。语法上更加紧凑,但可读性可能会稍差一些。同时,较旧版本可能对一些新的日期和时间函数支持有限,不过CURDATE()INTERVAL在较旧版本中通常也是支持的。