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

PostgreSQL中如何给STRING_AGG添加条件筛选分数低于60的记录

PostgreSQL查询调整需求

我有如下PostgreSQL查询(来自Codewars的Kata):

SELECT * FROM (
  SELECT 
    s.id AS student_id,
    MIN(s.name) AS name,
    CASE 
      WHEN COUNT(c.course_name) = 0 THEN 'quit studying' 
      WHEN SUM(CAST(c.score < 60 AS INTEGER)) >=3
        THEN CONCAT('failed in ', STRING_AGG(CONCAT(c.course_name, '(', c.score, ')'), ', ' ORDER BY c.course_name)) 
      ELSE NULL
    END AS reason
  FROM students s
  FULL OUTER JOIN courses c
    ON c.student_id = s.id
  GROUP BY s.id
) df
WHERE reason IS NOT NULL
ORDER BY student_id

该查询目前可正常运行,但需要微调:使用STRING_AGG合并多行生成结果时,仅需包含score低于60的记录,当前结果与期望结果存在差异。


调整后的查询

SELECT * FROM (
  SELECT 
    s.id AS student_id,
    MIN(s.name) AS name,
    CASE 
      WHEN COUNT(c.course_name) = 0 THEN 'quit studying' 
      WHEN SUM(CAST(c.score < 60 AS INTEGER)) >=3
        THEN CONCAT('failed in ', STRING_AGG(
          -- 仅保留不及格的课程记录
          CASE WHEN c.score < 60 THEN CONCAT(c.course_name, '(', c.score, ')') END,
          ', ' ORDER BY c.course_name
        )) 
      ELSE NULL
    END AS reason
  FROM students s
  FULL OUTER JOIN courses c
    ON c.student_id = s.id
  GROUP BY s.id
) df
WHERE reason IS NOT NULL
ORDER BY student_id

调整说明

  • 在STRING_AGG函数内部新增CASE判断,仅当课程成绩低于60分时才拼接课程名称和成绩的字符串,否则返回NULL
  • STRING_AGG默认会忽略NULL值,因此最终合并后的结果只会包含不及格的课程信息,符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:11