如何删除 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 没有。具有特定条件的从顶部开始的行数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 或 javascript 计算具有特定值的行数?