这是我的数据集:
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也应该没问题)
答案 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:
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 |
+-----+------------+-----------+