数据表如下所示:
我想查询一段日期范围内,不同id的数量,如果某个id的数量为0,那取这个id对应日期之前的最后一条不为0的数量。
比如,18号这天,id为1004的数量是0,但是17号时id为1004的数量是2,那需要查询出来18号id为1004的数量是2,查询结果如下图所示(查了17、18号两天的数据):
没有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`;
解释:
首先,我们使用主查询来获取指定日期范围内的所有记录。
对于每一行记录,我们使用IF函数来检查数量是否为0。
如果数量为0,则我们使用子查询来找到指定日期之前最后一条不为0的数量。子查询同样从数据表中选择日期小于当前记录日期并且数量不等于0的记录,然后按日期倒序排列,并且限制结果为1条。
如果数量不为0,则直接使用当前记录的数量值。
最后,我们将查询结果按日期和id进行排序,以保持与原始表的顺序一致。
请注意,这是一种较为复杂的查询方式,涉及子查询和条件判断。如果数据表的记录较大,查询的性能可能会受到影响。如果可能的话,可以考虑优化表结构或者利用其他方法来解决该问题。
【相关推荐】