繁体   English   中英

如何从第一行减去第二行并在mysql中生成输出列

[英]How to subtract second row from first row and generate a output column in mysql

我有一种情况,请考虑以下查询:

select 
    A.cakename, A.status, B.ordertime
from
    Cake as A
        inner join
    Orders as B on A.cakeid = B.cakeid

该查询的输出

cakename,   status,      ordertime
Apple Pie, available,    2014-03-20 22:34:46
Apple Pie, available,    2014-10-10 04:00:00
Apple Pie, available,    2015-03-20 22:34:46
Brownie,   available,    2014-03-20 22:35:07
Brownie,   available,    2015-05-20 22:35:07
Brownie,   available,    2014-03-26 22:36:07
Brownie,   available,    2015-05-20 14:35:48
Brownie,   available,    2015-05-20 22:35:07
Brownie,   available,    2015-05-10 22:35:07

现在,我想减去ordertime row n+1 - ordertime row n并创建一个单独的列来存储结果。 现在您可以忽略最后一行,因为将没有下一行。

例如: 2014-10-10 04:00:00 04: 2014-03-20 22:34:46 : 2014-03-20 22:34:46式将用于第一行,其结果将存储在新列中,以difference of consecutive ordertime 谁能给我一些解决这种情况的指示?

如果您可以帮助创建一个auto increment column ,这会很棒,因为那样我就可以自我加入并有所作为。

您可以添加一个额外的计算字段:

select 
A.cakename, A.status, B.ordertime,
(SELECT MAX(ordertime) FROM Orders AS C WHERE C.ordertime < B.ordertime) AS prev
from
Cake as A
    inner join
Orders as B on A.cakeid = B.cakeid
ORDER BY ordertime;

但是您最好在ordertime上有一个索引:

CREATE INDEX ord_ndx ON Orders(ordertime, cakeid);

实际上,您可以直接计算与上一次的差值 (假设它不是NULL;您必须为此提供默认值IF)。

另一种方式

但是,根据您的体系结构,通过添加一列( previous_order )可能会更好。 插入订单后,您便知道需要什么。 使用TRIGGER参见以下示例:

CREATE TABLE test ( itemid integer, ordertime timestamp, previous datetime );
CREATE INDEX test_ndx ON test (itemid, ordertime);

CREATE TRIGGER test_set_prev 
    BEFORE INSERT ON test 
    FOR EACH ROW
        SET NEW.previous = (
            SELECT MAX(ordertime) FROM test WHERE itemid = NEW.itemid
        );

现在您的表格会自动工作 时间戳列会自动更新,因此会把previous列:

insert into test (itemid) values (2);
select sleep(2);
insert into test (itemid) values (2);

+--------+---------------------+---------------------+
| itemid | ordertime           | previous            |
+--------+---------------------+---------------------+
|      2 | 2015-10-21 09:30:44 | NULL                |
|      2 | 2015-10-21 09:30:46 | 2015-10-21 09:30:44 |
+--------+---------------------+---------------------+

它还适用于多个插入:

insert into test (itemid) values (3), (2), (3);
SELECT t.*,
  IF(@prev IS NULL ,0 , TIMESTAMPDIFF(SECOND,t.ordertime,@prev)) diff,
  @prev = t.ordertime
FROM (
  SELECT 
    A.cakename, A.status, B.ordertime
  FROM Cake as A
  INNER JOIN Orders as B 
  ON A.cakeid = B.cakeid
  ORDER BY ordertime 
) t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM