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

如何检查表中同name分组按meas_date排序后value列的单调递增性并输出违规标记

嘿,这个需求我太熟悉了!要实现按name分组,检查每组内按meas_date排序后的value是否保持单调递增,最后输出id和破坏标记,用SQL的窗口函数就能轻松搞定,我给你一步步拆解,再附上可直接运行的代码~

核心思路

要解决这个问题,关键是分组+排序+前后值对比:

  • 先按name把数据分成独立的组,每组对应同一个名称的所有测量记录
  • 每组内按meas_date排序,保证时间顺序正确
  • 用窗口函数拿到当前行的前一行value,对比判断是否破坏递增性
通用SQL实现(支持PostgreSQL、MySQL 8.0+、SQL Server等)

先给你一个通用的版本,大部分现代数据库都支持:

首先是示例表和测试数据(方便你验证效果):

-- 创建测试表
CREATE TABLE measurements (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    meas_date DATE,
    value NUMERIC
);

-- 插入测试数据,其中id=3的记录破坏了A组的递增性
INSERT INTO measurements VALUES
(1, 'A', '2023-01-01', 10),
(2, 'A', '2023-01-02', 15),
(3, 'A', '2023-01-03', 12),
(4, 'B', '2023-01-01', 5),
(5, 'B', '2023-01-02', 7),
(6, 'B', '2023-01-03', 9);

然后是核心查询语句:

SELECT
    id,
    CASE
        -- 每组的第一行没有前序记录,默认标记为0(未破坏)
        WHEN LAG(value) OVER (PARTITION BY name ORDER BY meas_date) IS NULL THEN 0
        -- 当前值小于前一行的值,说明破坏了单调递增,标记为1
        WHEN value < LAG(value) OVER (PARTITION BY name ORDER BY meas_date) THEN 1
        -- 其他情况(等于或大于前一行)标记为0
        ELSE 0
    END AS is_non_increasing
FROM measurements
ORDER BY name, meas_date;

代码解释

  • PARTITION BY name:将数据按名称分组,确保我们只在同一个name的记录内做对比
  • ORDER BY meas_date:每组内按测量日期排序,保证时间顺序的正确性
  • LAG(value):窗口函数,用于获取当前行的前一行的value值,每组的第一行会返回NULL
  • CASE语句:根据前后值的对比结果生成标记,逻辑清晰易懂
特殊情况处理
  1. 严格递增 vs 非严格递增:如果需求是严格递增(不允许value等于前一行),只需要把判断条件改成WHEN value <= LAG(value)即可;默认的写法支持非严格递增(允许相等)。
  2. 同一日期有多条记录:如果同一个name在同一天有多个测量值,可以在ORDER BY里加额外字段(比如id)来保证排序稳定,改成ORDER BY meas_date, id。
  3. MySQL 5.x版本兼容:如果你的MySQL版本低于8.0(不支持窗口函数),可以用自连接的方式实现,虽然效率略低,但能解决问题:
SELECT
    m1.id,
    CASE
        WHEN EXISTS (
            SELECT 1
            FROM measurements m2
            WHERE m2.name = m1.name
              AND m2.meas_date < m1.meas_date
              AND m2.value > m1.value
        ) THEN 1
        ELSE 0
    END AS is_non_increasing
FROM measurements m1
ORDER BY m1.name, m1.meas_date;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:57