创建SQL视图:获取doc_type=3行的前序首个doc_type=2行的doc_lin
创建满足需求的SQL视图
原表数据
| doc_num | doc_lin | doc_type |
|---|---|---|
| DOC0001 | 1000 | 2 |
| DOC0001 | 2000 | 3 |
| DOC0001 | 3000 | 3 |
| DOC0001 | 4000 | 1 |
| DOC0001 | 5000 | 2 |
| DOC0001 | 6000 | 3 |
| DOC0001 | 7000 | 3 |
需求说明
创建SQL视图,每行需遵循以下规则:
- 若
doc_type = 3,返回该行之前最近的doc_type = 2行的doc_lin - 若
doc_type = 1或doc_type = 2,返回当前行的doc_lin
预期结果
| doc_num | doc_lin | doc_type | return |
|---|---|---|---|
| DOC0001 | 1000 | 2 | 1000 |
| DOC0001 | 2000 | 3 | 1000 |
| DOC0001 | 3000 | 3 | 1000 |
| DOC0001 | 4000 | 1 | 4000 |
| DOC0001 | 5000 | 2 | 5000 |
| DOC0001 | 6000 | 3 | 5000 |
| DOC0001 | 7000 | 3 | 5000 |
实现代码
CREATE VIEW doc_view AS SELECT doc_num, doc_lin, doc_type, CASE WHEN doc_type = 1 THEN doc_lin ELSE LAST_VALUE(CASE WHEN doc_type = 2 THEN doc_lin END) OVER (PARTITION BY doc_num ORDER BY doc_lin ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) END AS return FROM your_table;
代码说明
- 分区与排序:按
doc_num分区,确保只在同一份文档内查找数据;按doc_lin排序,保证行的顺序和原表一致。 - LAST_VALUE函数:在窗口范围内(从当前文档的第一行到当前行),提取最后一个
doc_type = 2的doc_lin值,正好匹配doc_type = 3时的需求。 - CASE分支处理:对
doc_type = 1的行单独返回自身doc_lin,符合预期结果;doc_type = 2的行会提取到自身的doc_lin,无需额外处理。
内容的提问来源于stack exchange,提问作者Marco Vivian
相关产品推荐
相关产品推荐

