我对 Oracle 很陌生,对分类数据完全陌生,所以请多多包涵……
我有一个大数据表,如下所示:
| tax_id | value |
|:------:|:-----:|
| 211 | 56.4 |
| 326 | 2.7 |
| 47 | 89.6 |
| 569 | 43.2 |
| … | … |
该tax_id
列通常指定物种,但有时它更通用,例如指定分类树中的属、目或更高级别。
我想通过聚合value
不同分类级别的列来计算汇总统计信息。为此,我需要加入额外的分类信息,因此我从NCBI分类数据库下载了该ncbi_nodes
表的副本。这个表很大(大约 150 万行),看起来像这样:
| tax_id | parent_id | rank |
|:------:|:---------:|:----:|
| 211 | 209 | 4 |
| 2 | 131567 | 28 |
| 209 | 72293 | 8 |
| 1224 | 2 | 24 |
| 29547 | 68525 | 21 |
| 68525 | 1224 | 23 |
| 72293 | 213849 | 12 |
| 131567 | 1 | 0 |
| 213849 | 29547 | 17 |
该rank
列采用从 0 到 28 的整数值,并指定每个tax_id
. 较低的等级指定更详细的分类级别(例如等级 4 是物种,等级 8 是属等),除了等级=0,它对应于“无等级/未定义”。
该表具有递归/分层结构,我不确定如何最好地使用它来聚合我的数据。我最初的想法是尝试“展平”它,使排名显示为列,如下所示:
| tax_id | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
|--------|--------|---|---|---|-----|---|---|---|-----|---|----|----|-------|----|----|----|----|--------|----|----|----|-------|----|-------|------|----|----|----|----|
| 211 | 131567 | | | | 211 | | | | 209 | | | | 72293 | | | | | 213849 | | | | 29547 | | 68525 | 1224 | | | | 2 |
| 209 | 131567 | | | | | | | | 209 | | | | 72293 | | | | | 213849 | | | | 29547 | | 68525 | 1224 | | | | 2 |
| 72293 | 131567 | | | | | | | | | | | | 72293 | | | | | 213849 | | | | 29547 | | 68525 | 1224 | | | | 2 |
| 213849 | 131567 | | | | | | | | | | | | | | | | | 213849 | | | | 29547 | | 68525 | 1224 | | | | 2 |
| 29547 | 131567 | | | | | | | | | | | | | | | | | | | | | 29547 | | 68525 | 1224 | | | | 2 |
| 68525 | 131567 | | | | | | | | | | | | | | | | | | | | | | | 68525 | 1224 | | | | 2 |
| 1224 | 131567 | | | | | | | | | | | | | | | | | | | | | | | | 1224 | | | | 2 |
| 2 | 131567 | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2 |
| 131567 | 131567 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
然后,我可以将此输出连接到我的原始数据,并通过GROUP BY
在任何rank
列上使用来计算汇总统计信息。
我的问题:
请问如何将递归表结构“展平”为上述结构?
我一直在阅读有关递归查询和 CTE 的文章,但我对 Oracle(和 SQL)还很陌生,所以我不确定这是否真的是我想要的。特别是,不同tax_ids
的具有不同的等级信息是否重要(即并非所有分类单元都有所有 29 个等级的条目,如上例所示)?
任何 SQL 提示都将不胜感激,甚至知道递归查询是正确还是错误的事情都会非常有帮助!
谢谢!