在Oracle中将LAG与表达式一起使用

时间:2020-06-10 19:40:37

标签: oracle lag

我在一个表中有一个列(状态),其中包含数字,值分别为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)。

那我怎么把它做成想要的表呢?

谢谢。

1 个答案:

答案 0 :(得分:0)

有什么帮助吗?

  • 第1-6行代表样本数据
  • TEMP CTE在这里获取LAG状态值(以提高可读性)
  • 最后一个selectBITOR的身份进行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>