Teradata:在满足条件时,是否可以忽略OLAP分区中的行,并且在未达成时仍将值传递给时值?

发布于 2025-02-11 10:22:27 字数 1020 浏览 1 评论 0原文

我正在根据客户以前的订单对数据进行分区,因此,如果客户以前在其帐户中添加了服务(他们有服务或不服务),我希望该价值将其带到下一行中对于所有订单状态如何,但我不希望通过下一个订单计算被取消的订单服务,我想跳过这些行并从先前完成的订单中降低价值。有人知道这是否可能吗?如果我按子句将字段添加到分区中,则将按订单状态进行分区,而不是从上一个完成的订单中报告订单状态。

(
Sum
    (
    SUBSCR1_ORD
    )
    Over 
        (
        PARTITION BY ACCT_NO
        ORDER BY ORDER_DATE
        ROWS BETWEEN 1 Preceding AND 1 Preceding
        )
)
AS EXISTING_SVC1

列的结果的样子,

acct_noorder_dateorder_statussubscr1_ordsubscr2_ordsubscr2_ord_svc1这就是
我希望根据subcr1_ord列中活动的现有_svcorder_statusercest_svc1order_datesubscr1_ord1234
ercest_svc2并 /2022取消-1110
12346/7/2022完成NULL110

I'm partitioning data based on a customers previous order, so if the customer previously added a service to their account (they either have the service or they don't), I want that value to carry down to the next row for that customer for all orders regardless of the order status, but I don't want canceled order services to be calculated with the next order, I want to skip those rows and bring down the value from the previously completed order. Does anyone know if this is possible? If I add the field into the Partition By clause, it'll partition by order status instead of reporting the order status from the previous completed order.

(
Sum
    (
    SUBSCR1_ORD
    )
    Over 
        (
        PARTITION BY ACCT_NO
        ORDER BY ORDER_DATE
        ROWS BETWEEN 1 Preceding AND 1 Preceding
        )
)
AS EXISTING_SVC1

This is what I'd want the results to look like for the EXISTING_SVC columns based on activity in the SUBSCR1_ORD column with special handing on ORDER_STATUS

ACCT_NOORDER_DATEORDER_STATUSSUBSCR1_ORDSUBSCR2_ORDEXISTING_SVC1EXISTING_SVC2
12346/5/2022Complete1null00
12346/6/2022Canceled-1110
12346/7/2022Completenull110

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

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

发布评论

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

评论(1

相对绾红妆 2025-02-18 10:22:27

将lag与忽略nulls和案例表达式使用以“下拉”先前的值。

SELECT Acct_No, Order_Date, Order_Status, Subscr1_Ord, Subscr2_Ord,
    LAG(CASE WHEN Order_Status='Canceled' THEN NULL ELSE Subscr1_Ord END,1,0)
        IGNORE NULLS
    OVER(PARTITION BY Acct_No ORDER BY Order_Date)
    AS Existing_Svc1,
    LAG(CASE WHEN Order_Status='Canceled' THEN NULL ELSE Subscr2_Ord END,1,0)
        IGNORE NULLS
    OVER(PARTITION BY Acct_No ORDER BY Order_Date)
     AS Existing_Svc2   
FROM MyTable
ORDER BY Order_Date;

Use LAG with IGNORE NULLS and a CASE expression to "pull down" the prior value.

SELECT Acct_No, Order_Date, Order_Status, Subscr1_Ord, Subscr2_Ord,
    LAG(CASE WHEN Order_Status='Canceled' THEN NULL ELSE Subscr1_Ord END,1,0)
        IGNORE NULLS
    OVER(PARTITION BY Acct_No ORDER BY Order_Date)
    AS Existing_Svc1,
    LAG(CASE WHEN Order_Status='Canceled' THEN NULL ELSE Subscr2_Ord END,1,0)
        IGNORE NULLS
    OVER(PARTITION BY Acct_No ORDER BY Order_Date)
     AS Existing_Svc2   
FROM MyTable
ORDER BY Order_Date;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文