impala中的sql标记特定行

eaf3rand  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(341)

这是我的数据集:

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

如果我的行是一个新会话,我想添加一个等于1的标志列(我通过newsession定义了一个事实,即当我通过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也可以)

vohkndzv

vohkndzv1#

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

oyxsuwqo2#

尝试此查询:

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可能不是这种情况。

相关问题