MySQL如何只取根据某列连续重复行的第一条记录

前言

MySQL如何只取根据某列连续重复行的第一条记录,条件:某列、连续、验重

建表准备

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` bigint NOT NULL,
  `time` datetime NULL DEFAULT NULL,
  `price` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

数据准备

在这里插入图片描述

方案

方案一:验重列组内分配排名&取排名第一个

SET @prev_value = NULL;
SET @rank = 0;

SELECT
  b.id,
  b.time,
  b.price 
FROM
  (
  SELECT
    a.id,
    a.time,
    a.price,
    @rank := IF ( @prev_value = a.price, @rank + 1, @rank := 0 ) AS order_num,
    @prev_value := a.price 
  FROM
    ( SELECT * FROM test ORDER BY id ) a 
  ) b 
WHERE
  b.order_num = 0;
  • @prev_value 用于存储验重列前一行的值。
  • @rank 用于给每个连续重复块内的每行分配一个排名。
    在这里插入图片描述
    ps: 此处 SELECT * FROM test ORDER BY id 根据id排序,可根据实际情况调整也可删除,加上最后的 WHERE b.order_num = 0 后就是取第一条数据;

方案二:验重列分组序号&组内取第一个

SET @prev_value = NULL;
SET @group_id = 0;
    
SELECT
  a.id,
  a.time,
  a.price 
FROM
  test a
  INNER JOIN ( 
    SELECT 
      MIN( b.id ) AS min_id 
    FROM
    (
    SELECT
      d.id,
      d.time,
      d.price,
      @group_id := IF( @prev_value = d.price, @group_id, @group_id + 1 ) AS group_id,
      @prev_value := d.price 
    FROM
      ( SELECT * FROM test ORDER BY id ) d
    ) AS b 
  GROUP BY
  b.group_id 
  ) AS c ON a.id = c.min_id;
  • @prev_value 用于存储验重列前一行的值。
  • @group_id 用于给每个连续重复块分配一个组号。
    在这里插入图片描述
    ps: 此处 SELECT * FROM test ORDER BY id 根据id排序,可根据实际情况调整也可删除,每组数据分配一个组号,然后再根据组号分组取第一条数据;
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Meteor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值