展平递归分类表(Oracle)

时间:2017-04-04 16:09:41

标签: oracle recursion ncbi

我对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,其对应于"无等级/未定义"。

此表具有递归/层次结构,我不确定如何最好地使用它来聚合我的数据。我最初的想法是试图“压扁”#34;它所以排名显示为列,如下所示:

| 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提示都会受到高度赞赏,甚至知道递归查询是否是正确或错误的跟进都会非常有用!

谢谢!

0 个答案:

没有答案