SQL查询,当前日期的数量为0,之前最后一条不为0的数据?

数据表如下所示:

img

我想查询一段日期范围内,不同id的数量,如果某个id的数量为0,那取这个id对应日期之前的最后一条不为0的数量。

比如,18号这天,id为1004的数量是0,但是17号时id为1004的数量是2,那需要查询出来18号id为1004的数量是2,查询结果如下图所示(查了17、18号两天的数据):

img

没有update权限,所以只能用select查,而且我是需要查多天的数据,不是查一天。
请教下这种SQL应该怎么写?

有条件的查询,好多基础教程都有

【以下回答由 GPT 生成】

SELECT t1.`日期`,
       t1.`id`,
       IF(t1.`数量` = 0,
          (SELECT t2.`数量`
           FROM 数据 t2
           WHERE t2.`日期` < t1.`日期`
             AND t2.`数量` != 0
           ORDER BY t2.`日期` DESC
           LIMIT 1),
          t1.`数量`) AS `数量`
FROM 数据 t1
WHERE t1.`日期` BETWEEN '2022-01-17' AND '2022-01-19'
ORDER BY t1.`日期`, t1.`id`;

解释:

  1. 首先,我们使用主查询来获取指定日期范围内的所有记录。

  2. 对于每一行记录,我们使用IF函数来检查数量是否为0。

  3. 如果数量为0,则我们使用子查询来找到指定日期之前最后一条不为0的数量。子查询同样从数据表中选择日期小于当前记录日期并且数量不等于0的记录,然后按日期倒序排列,并且限制结果为1条。

  4. 如果数量不为0,则直接使用当前记录的数量值。

  5. 最后,我们将查询结果按日期和id进行排序,以保持与原始表的顺序一致。

请注意,这是一种较为复杂的查询方式,涉及子查询和条件判断。如果数据表的记录较大,查询的性能可能会受到影响。如果可能的话,可以考虑优化表结构或者利用其他方法来解决该问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^