【问题标题】:How to get previous value from table in sql如何从sql中的表中获取先前的值
【发布时间】:2022-07-06 13:52:35
【问题描述】:

这是我的数据库表:

Type Qty total time
null null null 8:00:00
null null null 8:15:00
orange 2 2 8:30:00
orange 5 7 8:45:00
apple 10 10 9:00:00
orange 5 12 9:15:00
null null null 9:30:00
apple 8 18 9:45:00
orange 4 16 10:00:00

我想要如下表的结果,如果数据为空,则取上一个结果:

Type Qty total time
orange 0 0 8:00:00
apple 0 0 8:00:00
orange 0 0 8:15:00
apple 0 0 8:15:00
orange 2 2 8:30:00
apple 0 0 8:30:00
orange 5 7 8:45:00
apple 0 0 8:45:00
orange 5 7 9:00:00
apple 10 10 9:00:00
apple 10 10 9:15:00
orange 5 12 9:15:00
apple 10 10 9:30:00
orange 5 12 9:30:00
apple 8 18 9:45:00
orange 5 12 9:45:00
apple 8 18 10:00:00
orange 4 16 10:00:00

有人知道怎么做吗?提前致谢。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我们可以在这里使用日历表方法:

    SELECT t1.Type,
           COALESCE(t3.Qty, 0) AS Qty,
           COALESCE(t3.total, 0) AS total,
           t2.time
    FROM (SELECT DISTINCT Type FROM yourTable) t1
    CROSS JOIN (SELECT DISTINCT time FROM yourTable) t2
    LEFT JOIN yourTable t3
        ON t3.Type = t1.Type AND
           t3.time = t2.time
    ORDER BY
        t2.time,
        t1.Type;
    

    这里的方法是交叉连接查找所有类型和时间的子查询。然后,我们将其加入您的表中,为任何缺失的数量或总数填写零。请注意,如果您已经为所有类型和/或时间维护单独的表,则应使用它们来代替别名为 t1t2 的子查询。

    【讨论】:

      【解决方案2】:

      在 SQL 中获取前一行值的最常用方法是使用 LAG 函数。 LAG 函数返回前一行的值。根据 order by 子句确定上一行并返回列值。

      SELECT value - lag(value) OVER (ORDER BY Id) FROM table
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-18
        • 2018-11-18
        • 2013-05-16
        • 1970-01-01
        • 2021-09-18
        • 2021-10-18
        • 2019-09-30
        • 2022-10-24
        相关资源
        最近更新 更多