1

我对 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 提示都将不胜感激,甚至知道递归查询是正确还是错误的事情都会非常有帮助!

谢谢!

4

0 回答 0