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

按学生分组的SQL FLAG计算需求(含数据样本与规则)

问题描述

给定如下表结构和数据:

CREATE TABLE t
    (STUDENT int, SCORE int, DATE date)
;
    
INSERT INTO t
    (STUDENT, SCORE, DATE)
VALUES
    (1, 6, '2022-02-01 00:00:00'),
    (1, 2, '2022-03-12 00:00:00'),
    (1, 5, '2022-04-30 00:00:00'),
    (2, 2, '2022-04-12 00:00:00'),
    (2, 0, '2022-04-17 00:00:00'),
    (2, 7, '2022-05-08 00:00:00'),
    (3, 2, '2022-03-16 00:00:00'),
    (3, 6, '2022-03-18 00:00:00'),
    (3, 2, '2022-04-02 00:00:00'),
    (3, 9, '2022-04-27 00:00:00'),
    (4, 4, '2022-02-24 00:00:00'),
    (4, 0, '2022-02-26 00:00:00'),
    (5, 3, '2022-01-28 00:00:00'),
    (5, 0, '2022-02-21 00:00:00'),
    (5, 4, '2022-04-05 00:00:00')
;

需要生成包含STUDENT和FLAG字段的查询结果,FLAG计算规则如下:

  • 分别找出每个学生SCORE=2时的最小日期(记为min_date_2)和SCORE=6时的最小日期(记为min_date_6)
  • 若min_date_2 < min_date_6,则FLAG=1
  • 若min_date_2 >= min_date_6,则FLAG=0
  • 若学生有SCORE=2的记录但无SCORE=6的记录,则FLAG=1
解决方案

通过条件聚合获取每个学生的目标最小日期,再用CASE语句匹配规则生成FLAG:

SELECT
    STUDENT,
    CASE
        WHEN min_date_2 IS NOT NULL THEN
            CASE
                WHEN min_date_6 IS NULL OR min_date_2 < min_date_6 THEN 1
                ELSE 0
            END
    END AS FLAG
FROM (
    SELECT
        STUDENT,
        MIN(CASE WHEN SCORE = 2 THEN DATE END) AS min_date_2,
        MIN(CASE WHEN SCORE = 6 THEN DATE END) AS min_date_6
    FROM t
    GROUP BY STUDENT
) AS sub
WHERE min_date_2 IS NOT NULL;
查询结果

执行上述SQL后得到如下结果:

STUDENTFLAG
10
21
31
说明
  • 子查询通过CASE分组聚合,分别提取每个学生SCORE=2和6的最小日期
  • 外层CASE先筛选出有SCORE=2记录的学生,再按照规则判断FLAG值
  • 若需包含所有学生(即使无SCORE=2记录),可去掉外层的WHERE条件,此类学生的FLAG会显示为NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:05:09