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;
执行后就能得到你期望的结果:
| cod | value |
|---|---|
| 1 | value1 |
| 2 | value3 |
| 1 | value4 |
| 5 | value5 |
| 2 | value7 |
方案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
相关产品推荐
相关产品推荐

