按每行应用分区时的情况



我的表如下所示:

|--------|--------|--------|--------|---------|---------|
|  num_1 |  num_2 |  num_3 |level_1 | level_2 | level_3 |
|--------|--------|--------|--------|---------|---------|
|  1111  |  3333  |  4444  |  false |  false  |  false  |
|--------|--------|--------|--------|---------|---------|
|  1111  |  3333  |  5555  |  false |  false  |  false  |
|--------|--------|--------|--------|---------|---------|
|  1111  |  6666  |  null  |  false |  false  |  false  |
|--------|--------|--------|--------|---------|---------|
|  1111  |  7777  |  8888  |  false |  true   |  false  |
|--------|--------|--------|--------|---------|---------|

所以表格看起来是这样的:

|--------|--------|--------|--------|---------|---------|-------------|
|  num_1 |  num_2 |  num_3 |level_1 | level_2 | level_3 |   result    |
|--------|--------|--------|--------|---------|---------|-------------|
|  1111  |  3333  |  4444  | false  |  false  |  false  |    3333     |
|--------|--------|--------|--------|---------|---------|-------------|
|  1111  |  3333  |  5555  | false  |  false  |  false  |    3333     |
|--------|--------|--------|--------|---------|---------|-------------|
|  1111  |  6666  |  null  | false  |  false  |  false  |    6666     |
|--------|--------|--------|--------|---------|---------|-------------|
|  1111  |  7777  |  8888  | false  |  true   |  false  |    8888     |
|--------|--------|--------|--------|---------|---------|-------------|

编辑

这是一个简化的例子,但下面是这个表的工作原理:

  • num_x列将ID引用到另一个表中的元素,该表可能具有也可能不具有我们正在查找的某个属性
  • level_x列表示具有相同x值的列num_x是否具有设置为true的特定属性。这些条目表示具有或不具有该属性的元素的层次结构:
1111 ✘ > 3333 ✘ > 4444 ✘
> 5555 ✘
> 6666 ✘
> 7777 ✓ > 8888 ✘

我的目标是浏览整个表,为每一行找到上一级别没有true值的子级别的最低级别。例如,对于前几行,由于所有行都是1111的子行,并且1111有一个子级7777,其属性设置为true,所以与7777处于同一级别的所有其他子级都将是其自己行的结果,除非它们也有属性设置为true的子级。由于7777的属性设置为true,所以此行的结果是其直接子级8888。如果没有子项,则该行不需要结果。

下面的简单逻辑返回您指定的值。目前还不清楚这是否是你真正想要的:

select (case when not level_2 then num_3
else num_2
end) 

我的最佳猜测是,您需要一个相对简单的case表达式。我只是不清楚你真正需要什么。

相关内容

最新更新