2015-10-30 2 views
2

Моя исходная таблица «T1» выглядит следующим образом:Как сохранить значение из предыдущих записей

 ID Date  Order_ind Var2 Var3 
     1 1/1/2015   1 ..... ..... 
     1 1/5/2015   1 ..... ..... 
     1 1/5/2015   2 ..... ..... 
     2 1/10/2015   1 ..... ..... 
     2 1/20/2015   1 ..... ..... 
     2 1/20/2015   2 ..... ..... 
     2 1/20/2015   3 ..... ..... 

Финальный стол, который я хочу создать добавляет дополнительную переменную «new_var» на основе некоторых критериев. Как вы можете заметить, есть записи с той же датой, и эти критерии работают только с первой записью (order_ind = 1). Для остальных записей с той же датой, таких как order_ind = 2 или 3, значение new_var должно совпадать с записью order_ind = 1.

 ID Date  order_ind Var1 Var2 new_var 
     1 1/1/2015   1 ..... ..... 1 
     1 1/5/2015   1 ..... ..... 0 
     1 1/5/2015   2 ..... ..... 0 
     2 1/10/2015   1 ..... ..... 0 
     2 1/20/2015   1 ..... ..... 1 
     2 1/20/2015   2 ..... ..... 1 
     2 1/20/2015   3 ..... ..... 1 

Коды SQL, которые я написал, как эти:

 SELECT *, 
      CASE 
      WHEN order_ind=1 and (criteria1....) THEN '1' 
      WHEN order_ind=1 and (criteria2....) THEN '0' 
      WHEN order_ind<>1 .......(please advise how to code this) 
      END AS new_var 
    FROM T1 
    ; 

Любая идея, как написать код для записей с order_ind <> 1?

+1

Что такое 'aqua-data-studio'? Tag сказать, является идеей для sql .. но какая база данных? –

+0

Почему бы вам не добавить идентификатор автоинкремента в 'T1' и использовать его для ссылки на' new_var' - намного проще. – Kenney

+0

Ваши правила для 'new_var' arent clear, некоторые порядки 1 и 2 также' 0' –

ответ

1

Я бы сделал это за несколько минут. Сначала сделайте столбец ind_1_new_var, который содержит значения только для записей order_ind = 1.

select 
    * 
    ,case 
    when order_ind = 1 and (criteria1...) then 1 
    when order_ind = 1 and (criteria2...) then 0 
    else null 
    end ind_1_new_var 
from 
    t1; 

Затем создайте свой new_var, ссылаясь на эту колонку.

select 
    * 
    ,case 
    when order_ind = 1 and (criteria1...) then 1 
    when order_ind = 1 and (criteria2...) then 0 
    else null 
    end ind_1_new_var 
    ,max(ind_1_new_var) over (
    partition by id, date 
) new_var 
from 
    t1; 

Я не знаю вашего criteria1, но вот рабочий пример в моей базе данных с пг данных, которые вы дали.

TEST_DB(ADMIN)=> select * from t1 order by 1,2,3; 
ID | T1_DATE | ORDER_IND | VAR1 | VAR2 
----+------------+-----------+------+------ 
    1 | 2015-01-01 |   1 | 0 | 0 
    1 | 2015-01-05 |   1 | 0 | 0 
    1 | 2015-01-05 |   2 | 0 | 0 
    2 | 2015-01-10 |   1 | 0 | 0 
    2 | 2015-01-20 |   1 | 0 | 0 
    2 | 2015-01-20 |   2 | 0 | 0 
    2 | 2015-01-20 |   3 | 0 | 0 
(7 rows) 

TEST_DB(ADMIN)=> select 
TEST_DB(ADMIN)-> * 
TEST_DB(ADMIN)-> ,case 
TEST_DB(ADMIN)->  when order_ind = 1 and (
TEST_DB(ADMIN)(>  (id = 1 and t1_date = '2015-01-01') 
TEST_DB(ADMIN)(>  or (id = 2 and t1_date = '2015-01-20') 
TEST_DB(ADMIN)(> ) then 1 
TEST_DB(ADMIN)->  when order_ind = 1 and (
TEST_DB(ADMIN)(>  (id = 1 and t1_date = '2015-01-05') 
TEST_DB(ADMIN)(>  or (id = 2 and t1_date = '2015-01-10') 
TEST_DB(ADMIN)(> ) then 0 
TEST_DB(ADMIN)->  else null 
TEST_DB(ADMIN)-> end ind_1_new_var 
TEST_DB(ADMIN)-> ,max(ind_1_new_var) over (
TEST_DB(ADMIN)(>  partition by id, t1_date 
TEST_DB(ADMIN)(> ) new_var 
TEST_DB(ADMIN)-> from 
TEST_DB(ADMIN)-> t1 
TEST_DB(ADMIN)-> order by 1,2,3; 
ID | T1_DATE | ORDER_IND | VAR1 | VAR2 | IND_1_NEW_VAR | NEW_VAR 
----+------------+-----------+------+------+---------------+--------- 
    1 | 2015-01-01 |   1 | 0 | 0 |    1 |  1 
    1 | 2015-01-05 |   1 | 0 | 0 |    0 |  0 
    1 | 2015-01-05 |   2 | 0 | 0 |    |  0 
    2 | 2015-01-10 |   1 | 0 | 0 |    0 |  0 
    2 | 2015-01-20 |   1 | 0 | 0 |    1 |  1 
    2 | 2015-01-20 |   2 | 0 | 0 |    |  1 
    2 | 2015-01-20 |   3 | 0 | 0 |    |  1 
(7 rows) 
+0

Вы не должны пытаться ответить на вопрос, угадывая, чего хочет OP. По моему опыту, это пустая трата времени. И вы не можете использовать 'max (ind_1_new_var)' внутри того же уровня 'case ..end ind_1_new_var' Сначала вы должны создать подзапрос –

+0

Я понимаю, что это может растратить мое время. В Netezza вы, безусловно, можете ссылаться на псевдонимы столбцов, определенные перед текущим столбцом. Я сделал это только в производственном сценарии. –

+0

Пока мы даем предложения, вы не должны говорить, что что-то не может быть сделано, если вы не знаете наверняка. По моему опыту, это вводит в заблуждение и бесполезно. –