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

如何用SQL判断学生在指定年度区间内是否满足var1=a的条件

SQL需求实现:按自定义年度区间判断学生记录存在性

现有表结构与数据

现有表df,日期字段为DATE格式,结构及数据如下:

studentvar1startend
1a2010-01-012013-01-01
1b2010-01-012013-01-01
1b2013-05-052015-09-09
1a2017-10-102018-09-01
2c2010-01-012014-01-01
2a2015-01-012017-09-01
2b2019-01-012023-03-05

需求说明

  • 统计范围:2010年至2020年
  • 针对每个学生,在每年3月1日至次年3月1日的区间内,判断是否至少有一条var1='a'的记录
  • 满足条件返回TRUE,否则返回FALSE(无对应年份信息时也返回FALSE)

预期结果

SNStudentstart_timeend_timeat_least_one_var1_a
112010-03-012011-03-01TRUE
212011-03-012012-03-01TRUE
312012-03-012013-03-01TRUE
412013-03-012014-03-01FALSE
512014-03-012015-03-01FALSE
612015-03-012016-03-01FALSE
712016-03-012017-03-01FALSE
812017-03-012018-03-01TRUE
912018-03-012019-03-01TRUE
1012019-03-012020-03-01FALSE
1122010-03-012011-03-01FALSE
1222011-03-012012-03-01FALSE
1322012-03-012013-03-01FALSE
1422013-03-012014-03-01FALSE
1522014-03-012015-03-01TRUE
1622015-03-012016-03-01TRUE
1722016-03-012017-03-01TRUE
1822017-03-012018-03-01TRUE
1922018-03-012019-03-01FALSE
2022019-03-012020-03-01FALSE

我的尝试与问题

我尝试通过以下步骤实现,但遇到了问题:

步骤1:创建日期区间CTE

WITH step1 AS (
  SELECT '2010-03-01' AS start_date, '2011-03-01' AS end_date UNION ALL
  SELECT '2011-03-01', '2012-03-01' UNION ALL
  SELECT '2012-03-01', '2013-03-01' UNION ALL
  SELECT '2013-03-01', '2014-03-01' UNION ALL
  SELECT '2014-03-01', '2015-03-01' UNION ALL
  SELECT '2015-03-01', '2016-03-01' UNION ALL
  SELECT '2016-03-01', '2017-03-01' UNION ALL
  SELECT '2017-03-01', '2018-03-01' UNION ALL
  SELECT '2018-03-01', '2019-03-01' UNION ALL
  SELECT '2019-03-01', '2020-03-01'
)

步骤2:关联查询学生数据(返回空结果)

joined_data AS (
  SELECT 
    t.student,
    d.start_date,
    d.end_date,
    t.var1
  FROM 
    df t
  JOIN 
    date_ranges d
  ON 
    t.start <= d.end_date AND t.end >= d.start_date
)

这里的问题是joined_data返回空结果,后续原本计划用CASE WHEN统计:

var1_counts AS (
  SELECT 
    student,
    start_date,
    end_date,
    COUNT(CASE WHEN var1 = 'a' THEN 1 END) AS var1_count
  FROM 
    joined_data
  GROUP BY 
    student, start_date, end_date
)
SELECT 
  student,
  start_date,
  end_date,
  CASE WHEN var1_count > 0 THEN 'Yes' ELSE 'No' END AS at_least_one_var1_a
FROM 
  var1_counts;

希望在不使用交叉连接、关联查询或递归查询的前提下解决该问题,目前正在研究TO_CHAR()、TO_DATE()、CAST()、DATE_PART()及DATE_TRUNC()函数的用法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:35:05