微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

减去行并创建带有结果的新列

如何解决减去行并创建带有结果的新列

我对 MysqL 中的一个 sql 查询有疑问。我的表格如下所示:

Index User  Date                   Speed  
1     X     2018-01-01 10:00:00    23
1     X     2018-01-01 10:00:20    50
1     X     2018-01-02 10:00:00    40
1     Z     2018-01-01 10:00:00    20
1     Z     2018-01-02 10:00:00    40
1     Z     2018-01-03 10:00:00    50

结果应该是这样的:

Index User  Date                   Speed  Date_diff  Speed_diff
1     X     2018-01-01 10:00:00    23     
1     X     2018-01-01 10:00:20    50     20s          27
1     X     2018-01-01 10:02:00    40     1m40s        -10
1     Z     2018-01-01 10:00:00    20     -2m          -20
1     Z     2018-01-02 10:00:00    40     1d           20
1     Z     2018-01-03 10:00:00    50     1d           10

所以基本上我需要一个一个地减去行并创建一个带有结果的新列。我正在开始使用 sql 进行冒险,但我不确定如何才能做到这一点?有什么想法吗?

我尝试使用此 https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lag 执行此操作,但我认为我的语法错误

SELECT objid,LAG(Date) OVER AS 'lag',LEAD(Speed) OVER AS 'Lead',date- LAG(date) OVER AS 'lag diff',speed- LEAD(speed) OVER AS 'Lead diff',FROM tabel;

解决方法

尝试类似:

SELECT Index,User,'Date',Speed,'Date' - LAG('Date') OVER w AS Date_diff,Speed - LAG(Speed) OVER w AS Speed_diff
FROM table
WINDOW w AS (ORDER BY User,'Date');
,

只对字符串和日期值使用单引号——不要对列名使用单引号。

您的代码还需要一个窗口子句,并调整日期/时间算法。如果您可以将日期/时间差表示为 time,则:

SELECT t.*,secs_to_time(to_seconds(t.date) - LAG(to_seconds(t.date)) OVER (PARTITION BY user ORDER BY DATE)) AS date_diff
       (t.speed - LAG(speed) OVER (PARTITION BY user ORDER BY DATE)) as speed_diff
FROM tabel t;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。