我在一个表中有一个列(状态),其中包含数字,值分别为1、2或4。 我想在SQL查询中添加一个计算列(bitStatus),该列将存储当前行的状态列和前一行的列的按位演算符OR。
像这样:
| id | status| bitStatus|
|----|-------|----------|
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 4 | 7 |
| 4 | 1 | 7 |
所以我要做的是在oracle中使用LAG函数,但是只要我只想在计算列 bitStatus
上创建,我就不知道该怎么做。我的查询就像:
select id, status,
BITOR(LAG(bitStatus) OVER (ORDER BY 1), status)) AS bitStatus
但是正如您所知,在计算bitStatus时我不能使用LAG(bitStatus)。
那我怎么把它做成想要的表呢?
谢谢。
答案 0 :(得分:0)
有什么帮助吗?
TEMP
CTE在这里获取LAG
状态值(以提高可读性)select
以BITOR
的身份进行bitor(a, b) = a - bitand(a, b) + b
SQL> with test (id, status) as
2 (select 1, 1 from dual union all
3 select 2, 2 from dual union all
4 select 3, 1 from dual union all
5 select 4, 4 from dual
6 ),
7 temp as
8 (select id, status,
9 lag(status) over (order by id) lag_status
10 from test
11 )
12 select id,
13 status,
14 status - bitand(status, nvl(lag_status, status)) + nvl(lag_status, status) as bitstatus
15 from temp
16 order by id;
ID STATUS BITSTATUS
---------- ---------- ----------
1 1 1
2 2 3
3 1 3
4 4 5
SQL>