数据表如下所示:
我想查询不同id在当前行日期之前最后一个不为0的数量,例如我需要查17号和18号的数据,查询示例如下所示:
请教下,这种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;
这将返回以下结果:
id | date | quantity |
---|---|---|
1 | 2022-01-17 | 5 |
1 | 2022-01-18 | 0 |
2 | 2022-01-16 | 7 |
2 | 2022-01-18 | 8 |
希望这可以帮助你解决问题。如果你有任何其他问题,请随时提问。
【相关推荐】
补充说明下,我其实是想查询一段日期范围内,不同id的数量,如果某个id的数量为0,那取这个id对应日期之前的最后一条不为0的数量。
比如,18号这天,id为1001的数量是0,但是17号id为1001的数量是5,那需要查询出来18号id为1001的数量是5