计算Oracle中的连续发生

发布于 2025-01-27 23:42:33 字数 694 浏览 2 评论 0 原文

我有一个如下的桌子:

预期结果如下:

这里的T1是上个月,T2是上个月的最后一个,T3从现在开始3个月,依此类推。

total_inactivity =金额为0

max_consectee_inactivity =连续数月的最大数量为零的月数=零最近

_inactivity =最近从最近一个月开始的连续数月的最大数量,即t1 t1 t1 the the金额为0。这意味着如果T1表示T1除零外,有任何值,最近的inActivity将为零。例如,自t1_amount,t2_amount,t3_amount和t4_amount以来,Person_ID 5555的近期_ Inactivity = 4,全部为0。nb

:我有大约1000万个记录,并寻找优化的解决方案

I have a table like below:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=9bb88e4b8ac981eb9cfabb13848a79b9

The expected result is below:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=04932c1f5d6f49349a49aac63f51c78a

Here T1 is last month, T2 is last to last month, T3 is 3 months back from now and so on.

TOTAL_INACTIVITY = Total number of months where the amount is 0

MAX_CONSECUTIVE_INACTIVITY = Maximum number of consecutive months where the amount is zero

RECENT_INACTIVITY = Maximum number of consecutive months starting from the recent month i.e T1 and going backward where the amount is 0. That means if T1 has any value except zero, RECENT_INACTIVITY will be zero. For example, person_id 5555 has RECENT_INACTIVITY = 4 since T1_Amount,T2_Amount,T3_Amount and T4_Amount are all 0.

NB: I have around 10 million records and looking for an optimized solution

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

居里长安 2025-02-03 23:42:33

您可以使用案例表达式:

SELECT t.*,
       CASE t8_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t7_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t6_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t5_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t4_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t3_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t2_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t1_amount WHEN 0 THEN 1 ELSE 0 END AS total_inactivity,
       CASE
       WHEN (0,0,0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 8
       WHEN (0,0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 7
       WHEN (0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 6
       WHEN (0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 5
       WHEN (0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount),
         (t4_amount, t5_amount, t6_amount, t7_amount),
         (t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 4
       WHEN (0,0,0) IN (
         (t1_amount, t2_amount, t3_amount),
         (t2_amount, t3_amount, t4_amount),
         (t3_amount, t4_amount, t5_amount),
         (t4_amount, t5_amount, t6_amount),
         (t5_amount, t6_amount, t7_amount),
         (t6_amount, t7_amount, t8_amount)
       )
       THEN 3
       WHEN (0,0) IN (
         (t1_amount, t2_amount),
         (t2_amount, t3_amount),
         (t3_amount, t4_amount),
         (t4_amount, t5_amount),
         (t5_amount, t6_amount),
         (t6_amount, t7_amount),
         (t7_amount, t8_amount)
       )
       THEN 2
       WHEN (0) IN (
         (t1_amount), (t2_amount), (t3_amount), (t4_amount),
         (t5_amount), (t6_amount), (t7_amount), (t8_amount)
       )
       THEN 1
       ELSE 0
       END AS max_consecutive_inactivity,
       CASE t1_amount WHEN 0 THEN
         1 + CASE t2_amount WHEN 0 THEN
           1 + CASE t3_amount WHEN 0 THEN
             1 + CASE t4_amount WHEN 0 THEN
               1 + CASE t5_amount WHEN 0 THEN
                 1 + CASE t6_amount WHEN 0 THEN
                   1 + CASE t7_amount WHEN 0 THEN
                     1 + CASE t8_amount WHEN 0 THEN
                       1 
                       ELSE 0
                       END
                     ELSE 0
                     END
                   ELSE 0
                   END
                 ELSE 0
                 END
               ELSE 0
               END
             ELSE 0
             END 
           ELSE 0
           END
       ELSE 0
       END AS recent_inactivity
FROM   Tran_rec t;

对于示例数据,输出:

person_id t8_amount t7_amount t6_amount t5_amount t4_amount t3_amount t2_amount t1_amount total_inactivity max_consecnate_inactivity 最近的_inactivity
1111 0 0 0 20 34 0 89 33 4 3 0
2222 100 120 0 200 340 110 89 0 2 1 1
3333 0 0 0 0 0 0 0 110 7 7 0
4444 80 0 0 0 0 0 0 60 6 6 0
5555 80 70 60 50 0 0 0 0 4 4 4
6666 80 0 0 50 0 40 0 50 4 2 0

db<>> fiddle here

You can use CASE expressions:

SELECT t.*,
       CASE t8_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t7_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t6_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t5_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t4_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t3_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t2_amount WHEN 0 THEN 1 ELSE 0 END
       + CASE t1_amount WHEN 0 THEN 1 ELSE 0 END AS total_inactivity,
       CASE
       WHEN (0,0,0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 8
       WHEN (0,0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 7
       WHEN (0,0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount, t6_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 6
       WHEN (0,0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount, t5_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount, t6_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount, t7_amount),
         (t4_amount, t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 5
       WHEN (0,0,0,0) IN (
         (t1_amount, t2_amount, t3_amount, t4_amount),
         (t2_amount, t3_amount, t4_amount, t5_amount),
         (t3_amount, t4_amount, t5_amount, t6_amount),
         (t4_amount, t5_amount, t6_amount, t7_amount),
         (t5_amount, t6_amount, t7_amount, t8_amount)
       )
       THEN 4
       WHEN (0,0,0) IN (
         (t1_amount, t2_amount, t3_amount),
         (t2_amount, t3_amount, t4_amount),
         (t3_amount, t4_amount, t5_amount),
         (t4_amount, t5_amount, t6_amount),
         (t5_amount, t6_amount, t7_amount),
         (t6_amount, t7_amount, t8_amount)
       )
       THEN 3
       WHEN (0,0) IN (
         (t1_amount, t2_amount),
         (t2_amount, t3_amount),
         (t3_amount, t4_amount),
         (t4_amount, t5_amount),
         (t5_amount, t6_amount),
         (t6_amount, t7_amount),
         (t7_amount, t8_amount)
       )
       THEN 2
       WHEN (0) IN (
         (t1_amount), (t2_amount), (t3_amount), (t4_amount),
         (t5_amount), (t6_amount), (t7_amount), (t8_amount)
       )
       THEN 1
       ELSE 0
       END AS max_consecutive_inactivity,
       CASE t1_amount WHEN 0 THEN
         1 + CASE t2_amount WHEN 0 THEN
           1 + CASE t3_amount WHEN 0 THEN
             1 + CASE t4_amount WHEN 0 THEN
               1 + CASE t5_amount WHEN 0 THEN
                 1 + CASE t6_amount WHEN 0 THEN
                   1 + CASE t7_amount WHEN 0 THEN
                     1 + CASE t8_amount WHEN 0 THEN
                       1 
                       ELSE 0
                       END
                     ELSE 0
                     END
                   ELSE 0
                   END
                 ELSE 0
                 END
               ELSE 0
               END
             ELSE 0
             END 
           ELSE 0
           END
       ELSE 0
       END AS recent_inactivity
FROM   Tran_rec t;

Which, for the sample data, outputs:

PERSON_ID T8_AMOUNT T7_AMOUNT T6_AMOUNT T5_AMOUNT T4_AMOUNT T3_AMOUNT T2_AMOUNT T1_AMOUNT TOTAL_INACTIVITY MAX_CONSECUTIVE_INACTIVITY RECENT_INACTIVITY
1111 0 0 0 20 34 0 89 33 4 3 0
2222 100 120 0 200 340 110 89 0 2 1 1
3333 0 0 0 0 0 0 0 110 7 7 0
4444 80 0 0 0 0 0 0 60 6 6 0
5555 80 70 60 50 0 0 0 0 4 4 4
6666 80 0 0 50 0 40 0 50 4 2 0

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文