在 Oracle 中按数量对相似数据进行分组

Grouping of Similar data by amount in Oracle

我有一个包含 ac_id、txn_amt 列的交易 table。它将存储数据 txn 金额以及帐户 ID。下面是数据示例

AC_ID      TXN_AMT
10         1000
10         1000
10         1010
10         1030
10         5000
10         5010
10         10000
20         32000
20         32200
20         5000

我想编写一个查询,以便将所有在先前金额的 10% 范围内的金额组合在一起。输出应该是这样的:

AC_ID  TOTAL_AMT  TOTAL_CNT GROUP
10     4040       4         1
10     10010      2         2
20     64200      2         3
20     5000       1         4

我试过 LAG 函数,但仍然一无所知。这是我试过的代码片段:

select ac_id, txn_amt, round((((txn_amt - lag(txn_amt, 1) over (partition by ac_id order by ac_id, txn_amt))/txn_amt)*100,2) as amt_diff_pct from txn;

任何线索或帮助将不胜感激。

如果 previous 你的意思是 "the largest amount less than",那么你可以这样做。您可以找到差距在哪里(即大于 10% 的差异)。然后你可以通过计算间隙的数量来分配一个组:

select ac_id, sum(txn_amt) as total_amt, count(*) as total_cnt, grp
from (select t.*,
             sum(case when prev_txn_amt * 1.1 > txn_amt then 0 else 1 end) over
                 (partition by ac_id order by txn_amt) as grp
      from (select t.*,
                   lag(txn_amt) over (partition by ac_id order by txn_amt) as prev_txn_amt
            from txn t
           ) t
     ) t
group by ac_id, grp;