You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在MariaDB 10.6中用SQL查询连续日期组内最长递增solved序列

解决MariaDB 10.6中连续日期组内最长递增序列计算问题

假设user表结构如下:

CREATE TABLE user (
  date DATE PRIMARY KEY,
  solved INT
);

要实现需求,我们可以通过嵌套窗口函数,先完成连续日期分组,再在每个分组内识别solved的递增序列,最后统计最长序列长度。完整SQL如下:

WITH date_groups AS (
  -- 划分连续日期组:连续日期的group_id值一致
  SELECT
    date,
    solved,
    DATE_SUB(date, INTERVAL ROW_NUMBER() OVER (ORDER BY date) DAY) AS group_id
  FROM user
),
solved_sequences AS (
  -- 在每个日期组内标记递增序列:solved不大于前一行时开启新序列
  SELECT
    group_id,
    date,
    solved,
    SUM(CASE WHEN solved > LAG(solved, 1, -1) OVER (PARTITION BY group_id ORDER BY date) THEN 0 ELSE 1 END) OVER (PARTITION BY group_id ORDER BY date) AS seq_id
  FROM date_groups
),
sequence_lengths AS (
  -- 统计每个日期组内各递增序列的长度
  SELECT
    group_id,
    seq_id,
    COUNT(*) AS seq_len
  FROM solved_sequences
  GROUP BY group_id, seq_id
),
max_seq_per_group AS (
  -- 获取每个日期组的最长递增序列长度
  SELECT
    group_id,
    MAX(seq_len) AS longest_increasing_seq
  FROM sequence_lengths
  GROUP BY group_id
)
-- 整合最终结果:连续天数、起止日期、最长递增序列长度
SELECT
  COUNT(*) AS consecutive_days,
  MIN(d.date) AS start_date,
  MAX(d.date) AS end_date,
  m.longest_increasing_seq
FROM date_groups d
JOIN max_seq_per_group m ON d.group_id = m.group_id
GROUP BY d.group_id, m.longest_increasing_seq
ORDER BY start_date;

关键步骤说明

  • date_groups:利用日期与行号的差值生成连续日期分组标识,确保连续日期归为同一组。
  • solved_sequences:通过LAG()函数对比当前行与前一行的solved值,用累加标记区分不同的递增序列。
  • sequence_lengths:统计每个递增序列的包含的行数(即长度)。
  • max_seq_per_group:提取每个日期组内最长的递增序列长度。
  • 最终查询:聚合每个日期组的基础信息,关联最长序列长度后输出结果。

内容的提问来源于stack exchange,提问作者Squidonis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:57:11