在黑斑羚中标记特定的线条

时间:2017-03-09 08:08:53

标签: sql impala

这是我的数据集:

IDX  SESSION_ID
1    Null
2    Null
3    Foo
4    Foo
5    Foo
6    Null
7    Bar
8    Bar

如果我的行是一个新会话,我想添加一个等于1的标志列(我通过新会话定义了当我按IDX订购时会话ID发生变化的事实)

在这种情况下,输出将是:

IDX  SESSION_ID  N_Session
1    Null        1
2    Null        0
3    Foo         1
4    Foo         0
5    Foo         0
6    Null        1
7    Bar         1
8    Bar         0

如何使用impala sql做到这一点? (ANSI SQL也应该没问题)

2 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT t1.IDX,
       t1.SESSION_ID,
       CASE WHEN t1.IDX = 1 OR
                 t1.SESSION_ID IS NULL AND t2.SESSION_ID IS NOT NULL OR
                 t1.SESSION_ID IS NOT NULL AND t2.SESSION_ID IS NULL OR
                 COALESCE(t1.SESSION_ID, 'a') <> COALESCE(t2.SESSION_ID, 'a')
            THEN 1
            ELSE 0 END AS N_Session
FROM yourTable t1
LEFT JOIN yourTable t2
    ON t1.IDX = t2.IDX + 1

这是一个表格,显示加入的临时结果应该是什么样的:

IDX  SESSION_ID   IDX2   SESSION_ID2   N_Session
1    Null         NULL   NULL          1            <-- first row, 1
2    Null         1      NULL          0            <-- session values agree, 0
3    Foo          2      NULL          1            <-- values different, 1
4    Foo          3      Foo           0
5    Foo          4      Foo           0
6    Null         5      Foo           1            <-- values different, 1
7    Bar          6      NULL          1
8    Bar          7      Bar           0

应该清楚的是,我们希望在以下两种情况之一中将N_Session标记为1:

  • 两个会话ID不同意
  • 两个会话ID一致,但该行是第一行(IDX值为1)

我的查询的详细程度源于必须处理NULL值。如果我正确读取了您的逻辑,那么比较时的两个NULL值实际上应该被视为相同的值,使用某些运算符的Impala SQL可能不是这种情况。

答案 1 :(得分:1)

select  IDX
       ,SESSION_ID

       ,case 
            when    coalesce (SESSION_ID,'') 
                =   lag(coalesce(SESSION_ID,'')) over (order by IDX) 
            then 0 
            else 1 
        end         as N_Session

from    mytable2
;
+-----+------------+-----------+
| idx | session_id | n_session |
+-----+------------+-----------+
| 1   | NULL       | 1         |
| 2   | NULL       | 0         |
| 3   | Foo        | 1         |
| 4   | Foo        | 0         |
| 5   | Foo        | 0         |
| 6   | NULL       | 1         |
| 7   | Bar        | 1         |
| 8   | Bar        | 0         |
+-----+------------+-----------+