Запрос столбца на основе значения другого столбца - PullRequest
1 голос
/ 17 марта 2020

Привет, у меня есть такая структура таблицы:

id-rank id name  value    rank
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2
  1-3   1  abc somevalue3  3
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

Здесь id-rank - это объединение id и rank. Теперь, если ранг больше 1 (скажем, 2), я хочу извлечь данные столбца значения для id-ранга 1-1, то есть somevalue1.

Вот sql, который я написал

select *
case when rank > 1 then (select value where id-rank = concat(id,'-',rank-1) from table)
else ''
from table

Ожидаемый вывод:

id-rank id name  value    rank new_value
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2   somevalue1  
  1-3   1  abc somevalue3  3   somevalue2  
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

Мой текущий вывод

id-rank id name  value    rank new_value
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2   null
  1-3   1  abc somevalue3  3   null
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

Но в столбце new_value я получаю значение null. Я думаю, это потому, что он сравнивает только соседние столбцы. Я новичок в sql, пожалуйста, дайте мне знать, если у кого-то есть решение для этого.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы можете использовать lag():

select t.*, prev_val
      (case when rank > 1 then prev_val end) as new_value
from (select t.*, 
            lag(value) over (partition by id order by rank) as prev_val
      from table t
     ) t;

РЕДАКТИРОВАТЬ: Если вы ищете конкретное c предыдущее значение, то будет достаточно только lag().

select t.*, 
       lag(value) over (partition by id order by rank) as new_value
from table t;
0 голосов
/ 17 марта 2020

Я бы использовал условное max():

select t.*,
       max(case when rank = 1 then value end) over
           (partition by id) as new_value
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...