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

MySQL如何筛选与上一行cod不同的记录?能否获取上一行值?

没问题,这两个需求MySQL都能搞定!我来给你详细说明怎么实现:

问题1:MySQL是否可以实现该需求?

完全可以!我们可以通过获取每行的上一行cod值,再筛选出当前行cod与上一行不同的记录(包括第一行),就能得到你想要的结果集。

问题2:MySQL中是否有方法获取上一行的值?

当然有!获取上一行的值是实现这个需求的核心,根据你的MySQL版本,有两种常用方案:

方案1:使用窗口函数LAG()(MySQL 8.0及以上版本)

LAG()是MySQL 8.0引入的窗口函数,专门用来获取当前行之前指定偏移量的行的数据,非常适合这个场景。

首先需要明确:数据库表的行是无序的,所以必须指定一个排序字段(比如自增ID、创建时间等)来确定行的顺序,否则“上一行”的概念没有意义。假设你的表有一个自增主键id(用来对应示例中的数据顺序),示例表结构和数据如下:

CREATE TABLE test_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cod INT,
    value VARCHAR(20)
);

INSERT INTO test_data (cod, value) VALUES
(1, 'value1'),
(1, 'value2'),
(2, 'value3'),
(1, 'value4'),
(5, 'value5'),
(5, 'value6'),
(2, 'value7');

然后执行以下查询:

SELECT cod, value
FROM (
    SELECT 
        cod, 
        value,
        -- 获取上一行的cod值,按id排序确定行顺序
        LAG(cod) OVER(ORDER BY id) AS prev_cod
    FROM test_data
) AS sub
-- 筛选第一行(prev_cod为NULL)或当前cod与上一行不同的记录
WHERE prev_cod IS NULL OR cod != prev_cod;

执行后就能得到你期望的结果:

codvalue
1value1
2value3
1value4
5value5
2value7

方案2:使用用户变量(MySQL 8.0以下版本)

如果你的MySQL版本低于8.0,不支持窗口函数,可以用用户变量来模拟获取上一行的值:

SELECT cod, value
FROM (
    SELECT 
        cod, 
        value,
        -- 先获取上一行的cod值,再更新变量为当前cod
        @prev_cod AS prev_cod,
        @prev_cod := cod AS current_cod
    FROM test_data, (SELECT @prev_cod := NULL) AS init_var
    -- 同样要指定排序字段确定行顺序
    ORDER BY id
) AS sub
WHERE prev_cod IS NULL OR cod != prev_cod;

这个方法的原理是初始化一个用户变量@prev_cod,遍历每行时先读取变量的旧值(即上一行的cod),再把当前行的cod赋值给变量,从而实现“记录上一行值”的效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:21:47