如何删除 x 没有。具有特定条件的从顶部开始的行数

Posted

技术标签:

【中文标题】如何删除 x 没有。具有特定条件的从顶部开始的行数【英文标题】:How do I delete x no. of rows from the top with a certain condition 【发布时间】:2021-12-29 21:09:30 【问题描述】:

如果equipstatus等于操作,有没有办法从顶部删除x条记录。 如果后续的equipstatus 有多个操作值,则另一个要求将只保留一个(第一条记录)。请在下面找到示例数据。

-- SAMPLE TABLE
CREATE TABLE equipment (
equipstatus varchar(50), 
dt datetime,
id varchar(35),
PRIMARY KEY (id)

);

-- SAMPLE DATA
INSERT INTO equipment(equipstatus, dt, id) 
VALUES
('operation','2021-08-31 09:30:09','001'),
 ('operation','2021-08-31 09:42:09','002'),
 ('operation','2021-08-31 11:45:09','003'),
 ('work','2021-08-31 12:50:09','004'),
 ('operation','2021-08-31 14:20:09','005'),
 ('work','2021-08-31 16:30:090','006')    , 
 ('operation','2021-08-31 17:30:09','007'),
 ('operation','2021-08-31 17:45:09','008')   ,
('work','2021-08-31 17:58:09','009'); 


EXPECTED RESULT
equip_status-------dt------------id
work--------2021-08-31 12:50:09---004
operation---2021-08-31 14:20:09---005
work--------2021-08-31 16:30:09---006 
operation---2021-08-31 17:30:09---007
work--------2021-08-31 17:58:09---009

【问题讨论】:

表格顶部有 三个 operation 记录。为什么没有一个被保留? 它应该总是以equip status=;Work'开始 【参考方案1】:

使用窗口函数LAG

SELECT equipstatus, dt, id
FROM (
  SELECT *, LAG(equipstatus) OVER(ORDER BY dt ASC) prev_status
  FROM equipment
) t
WHERE equipstatus <> 'operation' OR (prev_status IS NOT NULL AND prev_status <> 'operation')

或者在旧的 mysql

SELECT a.*
FROM equipment a
WHERE a.equipstatus <> 'operation' 
OR (
  SELECT b.equipstatus
  FROM equipment b
  WHERE b.dt < a.dt
  ORDER BY b.dt DESC
  LIMIT 1
) <> 'operation'

【讨论】:

不能在我的 SQL 上使用 LAG。尝试运行旧的mySQL,结果不是预期的结果。 @Jon 它返回的结果与您发布的完全相同。见db-fiddle dbfiddle.uk/…怎么不工作,请提供详细信息 非常感谢。结果与我的样本相同。如果我更改逻辑以获取多个后续生产的第一条记录,我将按 dt 更改顺序。 DESC 到 ASC

以上是关于如何删除 x 没有。具有特定条件的从顶部开始的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何删除具有特定条件的行? [复制]

如何删除excel中符合特定条件的所有行,以及随后的行

如何使用 jquery 或 javascript 计算具有特定值的行数?

如何构建具有特定行数的表格视图?

当数据的行数多于替换项时,如何替换按特定条件分组的所有数据行?

获取数据表中满足特定条件的行数