在 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;
我有一个包含 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;