Case when over partition by applied per row

南楼画角 提交于 2020-12-27 06:08:44

问题


My table looks like this:

|--------|--------|--------|--------|---------|---------|
|  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  |
|--------|--------|--------|--------|---------|---------|

So that the table looks like this:

|--------|--------|--------|--------|---------|---------|-------------|
|  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     |
|--------|--------|--------|--------|---------|---------|-------------|

Edit

This is a simplified example, but here is how this table works:

  • The num_x columns reference the ID to an element in another table, which might or might not have a certain attribute we're looking for.
  • The level_x columns represents whether the column num_x with the same x value has that certain attribute set to true. These entries represent a hierarchy of elements which do or do not have that attribute:
1111 ✘ > 3333 ✘ > 4444 ✘
                 > 5555 ✘
       > 6666 ✘
       > 7777 ✓ > 8888 ✘

My goal is to go through the whole table, and find the lowest level for each row at which the previous level has no child level with a true value. For example, for the first few rows, since all rows are children of 1111 and that 1111 has a child, 7777, with its attribute set to true, all other children at the same level as 7777 would be the result of their own row, unless they do have children with their attribute set to true as well. Since 7777 has its attribute set to true, the result of this row is its immediate child, 8888. If it did not have a child, the row would not need a result.


回答1:


The following simple logic returns the values you specify. It is not clear if this is what you actually intend:

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

My best guess is that a relatively simple case expression is what you need. I am just unclear on what you really need.



来源:https://stackoverflow.com/questions/64692467/case-when-over-partition-by-applied-per-row

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!