这里的第一个问题,请温柔。我很长一段时间都是一个潜伏者,现在认为这是一个参与的好时机。
使用Oracle OBIEE 12c,我希望在我的结果数据集中为一组维度的实例创建一个运行计数器,如果该组再次启动,则会重置该计数器。像这样 - 在下面的示例中,计数器将考虑客户ID和状态:
s[i+1]
有什么想法吗?我已经尝试了案例陈述和RSUM()的组合,但我无法完成我之后的事情,并且我正在寻找一种全新的方法。
由于
答案 0 :(得分:1)
我不确定您希望如何订购数据,因此这很重要。您似乎按订单ID订购。
您可以在分区中使用计数。虽然这可能不起作用,具体取决于您的数据的订购方式。
SELECT CUSTID, ORDERID, STATUS, count(*)
over (PARTITION BY CUSTID||STATUS ORDER BY ORDERID ROWS UNBOUNDED PRECEDING) COUNTER
FROM MYTEST;
您还可以使用LAG检查行更改,例如:
SELECT CUSTID, ORDERID, STATUS, curr_row, prev_row
,CASE WHEN curr_row != prev_row THEN 'Change' ELSE 'Same Group' END as TRACKER
FROM (
SELECT CUSTID, ORDERID, STATUS, CUSTID||STATUS AS curr_row
,LAG(CUSTID||STATUS) OVER (ORDER BY CUSTID, ORDERID, STATUS) AS prev_row
FROM MYTEST
ORDER BY ORDERID
)
;
以上示例使用这组测试数据: Test Data
答案 1 :(得分:0)
您应该将OBIEE外部的计数器计算为提取/加载/转换过程的一部分。 以下是使用Oracle中ROW_NUMBER analytical function的近似值。
with dataset as (
SELECT 111 AS cust_id,
123456 AS order_id,
'APPROVED' AS status,
1 AS expected_counter
FROM dual
UNION ALL
SELECT 111,123457,'APPROVED',2 FROM dual
UNION ALL
SELECT 111,123458,'APPROVED',3 FROM dual
UNION ALL
SELECT 111,123459,'DECLINED',1 FROM dual
UNION ALL
SELECT 111,123460,'APPROVED',1 FROM dual
UNION ALL
SELECT 111,123461,'APPROVED',2 FROM dual
UNION ALL
SELECT 222,1234562,'APPROVED',1 FROM dual
UNION ALL
SELECT 222,1234563,'APPROVED',2 FROM dual
)
select cust_id,order_id,status,expected_counter,row_number() over (partition by cust_id,status order by order_id asc) as counter from dataset ;
结果是:
cust_id /order_id /status / your_counter / my_counter
111 123456 APPROVED 1 1
111 123457 APPROVED 2 2
111 123458 APPROVED 3 3
111 123460 APPROVED 1 4
111 123461 APPROVED 2 5
111 123459 DECLINED 1 1
222 1234562 APPROVED 1 1
222 1234563 APPROVED 2 2
此示例可帮助您了解客户111有5个已批准的订单,1个被拒绝;客户222有2个已批准的订单。我无法与你的确切计数器相匹配。希望这有帮助
答案 2 :(得分:0)
在OBIEE分析列公式语法中,它类似于
RCOUNT("订单"。"状态""客户"。"客户ID")