task表里一个orderno有多个taskno,一个taskno对应一个waybillno,通过orderno找到多个taskno,想对taskno排序后找到指定taskno前面一个taskno和其对应的waybillno 应该怎么写
时间: 2024-10-11 09:06:21 浏览: 34
假设你有一个名为`tasks`的任务表,其中包含`orderno`, `taskno`, 和 `waybillno`字段,你可以使用SQL查询来实现这个需求。首先,你需要找到指定`orderno`下的所有`taskno`并排序,然后找出指定`taskno`前一个的任务及其对应的`waybillno`。这可以分为两步:
1. 获取指定orderno的所有`taskno`并排序:
```sql
SELECT taskno
FROM tasks
WHERE orderno = 'your_order_number'
ORDER BY taskno;
```
将`'your_order_number'`替换为你要查找的实际订单号。
2. 找到指定`taskno`前一个的任务及其`waybillno`(如果存在):
```sql
WITH ordered_tasks AS (
SELECT taskno,
ROW_NUMBER() OVER (PARTITION BY orderno ORDER BY taskno) as row_num
FROM tasks
WHERE orderno = 'your_order_number'
)
SELECT t1.taskno AS previous_taskno, t1.waybillno
FROM ordered_tasks t1
LEFT JOIN ordered_tasks t2 ON t1.row_num = t2.row_num - 1 AND t1.orderno = t2.orderno
WHERE t1.taskno = 'your_target_taskno';
```
这里,我们使用窗口函数`ROW_NUMBER()`给每个`orderno`内的`taskno`分配行号。然后,我们在`ordered_tasks`上做左连接,寻找目标`taskno`的前一个任务(`t2`)。如果存在,则返回`previous_taskno`和相应的`waybillno`;如果没有前一个任务(即`row_num - 1`不存在),则不会返回结果。
将`'your_order_number'`和`'your_target_taskno'`替换为你实际的数据。
阅读全文