【问题标题】:How to keep the value from previous records [closed]如何保留以前记录中的值[关闭]
【发布时间】:2015-10-30 21:47:44
【问题描述】:

我的原始表“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_ind1 的记录编写代码吗?

【问题讨论】:

  • 什么是aqua-data-studio?标签说是 sql 的 ide .. 但是什么数据库?
  • 为什么不向T1 添加一个自动增量ID,并用它在new_var 中引用它——简单得多。
  • 你对new_var的规则不清楚,有些订单1和2也是0
  • 向您的else添加另一个案例?
  • 我的问题不是答案,您仍然有两个 order=1 的值,您将使用哪一个作为 order=2 ?你应该阅读Need an Answer? Actually, No ... You Need a Question

标签: sql netezza aqua-data-studio


【解决方案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,但这是我的 nz 数据库中的一个工作示例,其中包含您提供的数据。

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)

【讨论】:

  • 你不应该试图通过猜测 OP 想要什么来回答问题。以我的经验是浪费时间。而且你不能在case .. end ind_1_new_var 的同一级别内使用max(ind_1_new_var) 你必须先创建一个子查询
  • 我明白这可能会浪费我的时间。在 Netezza 中,您当然可以引用在当前列之前定义的列别名。我今天刚刚在生产脚本中做到了。
  • 在我们提供建议时,您不应该在不确定的情况下说某些事情无法完成。根据我的经验,这具有误导性且无益。
  • 我说你不​​能在 postgre 或 sql server 这样的普通 sql 中做到这一点,如果你说你可以在 netezza 中做到这一点,我会相信你的话,但我不相信。
  • 。这是SO post,我用我的数据库的结果更新了我的答案。
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多