如何只有在改变之后才能获得价值

Posted

技术标签:

【中文标题】如何只有在改变之后才能获得价值【英文标题】:How to get value only after change 【发布时间】:2020-11-09 15:21:05 【问题描述】:

假设我有一个简单的数据库,例如:

CREATE TABLE test (
  id INT,
  time datetime,
  status integer
);

还有一些数据:

INSERT INTO test (id, time, status) VALUES (1, '2020-11-09 10:00', 256);
INSERT INTO test (id, time, status) VALUES (2, '2020-11-09 11:00', 256);
INSERT INTO test (id, time, status) VALUES (3, '2020-11-09 11:20', 512);
INSERT INTO test (id, time, status) VALUES (4, '2020-11-09 11:35', 512);
INSERT INTO test (id, time, status) VALUES (5, '2020-11-09 11:40', 1024);
INSERT INTO test (id, time, status) VALUES (6, '2020-11-09 11:45', 1024);
INSERT INTO test (id, time, status) VALUES (7, '2020-11-09 11:48', 1024);
INSERT INTO test (id, time, status) VALUES (8, '2020-11-09 12:00', 0);
INSERT INTO test (id, time, status) VALUES (9, '2020-11-09 12:01', 0);
INSERT INTO test (id, time, status) VALUES (10, '2020-11-09 12:05', 0);
INSERT INTO test (id, time, status) VALUES (11, '2020-11-09 12:07', 0);
INSERT INTO test (id, time, status) VALUES (12, '2020-11-09 12:09', 512);

我想要做的是只有状态发生变化时的行。 简单的 DISTINCT 只给我 1 个值,所以不是那么容易:

SELECT DISTINCT(status), time FROM test;

所以我的预期结果应该有 id: 1、3、5、8和12

我需要分组吗?将不胜感激。

这里是 SQL Fiddle: https://www.db-fiddle.com/f/nixj1LCKLJCfeXk9q7233P/0

【问题讨论】:

请注意,DISTINCT 不是函数 【参考方案1】:

你可以使用lag():

select *
from (
    select t.*, lag(status) over(order by time) lag_status
    from test t
) t
where not status <=> lag_status

这需要 mysql 8.0。在早期版本中,一种方法使用相关子查询:

select t.*
from test t
where not status <=> (
    select t1.status
    from test t1
    where t1.time < t.time 
    order by t1.time desc
    limit 1
)

https://www.db-fiddle.com/f/nixj1LCKLJCfeXk9q7233P/1

【讨论】:

有趣的方法,感谢您的快速响应,两个代码都可以正常工作。我可能会使用第二个 - 只是为了兼容性 @Tikky:第一个查询效率更高,优先使用它!所有主要数据库都支持窗口函数很长时间了,只有 MySQL 来晚了...

以上是关于如何只有在改变之后才能获得价值的主要内容,如果未能解决你的问题,请参考以下文章

低代码平台有何优势,如何改变现有软件开发模式,帮助企业实现商业价值?

构建数据中台——数据只有被使用起来,才能创造价值

改变游戏循环中的价值

我怎样才能获得数据表的价值呢?当我点击更新。我也想更新我的文本框,但我的数据表只更新

企业大数据应用只有做到数据与业务深度融合才能体现其巨大价值

Pyserial没有从Arduino获得新的价值