如何在(Teradata)仅使用 ANSI SQL 时实现重置?

Posted

技术标签:

【中文标题】如何在(Teradata)仅使用 ANSI SQL 时实现重置?【英文标题】:How to implement a reset when (Teradata) using ANSI SQL only? 【发布时间】:2021-03-27 10:23:14 【问题描述】:

enter image description here 我需要编写一个查询来计算客户交易超过 250 磅的次数。累积添加直到总和超过 250,然后重置并从下一行开始,直到超过 250,依此类推。可以使用 Teradata 关键字“RESET WHEN”来执行此功能,但我应该创建一个仅由 ANSI SQL SYNTAX 组成的查询。 有人可以帮忙吗?

 SUM(sales) OVER (
            PARTITION BY region
            ORDER BY day_of_calendar
            RESET WHEN sales < /* preceding row */ SUM(sales) OVER (
                 PARTITION BY region
                 ORDER BY day_of_calendar
                 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
            ROWS UNBOUNDED PRECEDING
       )

1:https://i.stack.imgur.com/lu4Jp.png这是客户输入的样本 enter image description here 这就是输出。 每次客户的总消费超过250,我应该从0再次求和,找出客户超过250美元的那一天。

【问题讨论】:

能否提供样本数据和预期结果? 检查***.com/a/53344956/2527905 但它可能不起作用,那么你需要递归。你能展示一些示例数据和预期结果吗?如果你的 我已经用输入和预期输出更新了帖子。输出的最后一个 col 名称应该是 pass_250(不要让你感到困惑)。 好的,获得预期结果的唯一方法是递归查询。没时间写,不过应该有例子 好的,谢谢您的回复。 【参考方案1】:

没有你的表定义和一个非常有限的数据集的屏幕截图,很难测试我对你的数据的回答 - 所以我首先在 match_recognize tutorial 提供的数据集上显示它,然后使用实时 SQL你的专栏:

SELECT
  *
  FROM
  ticker MATCH_RECOGNIZE (
    PARTITION BY symbol
    ORDER BY tstamp
    MEASURES
      nvl(SUM(up.price),0) AS tot
    ALL ROWS PER MATCH
  PATTERN ( up* ) DEFINE
    up AS SUM(up.price) - up.price <= 100
  );

所以在你的桌子上这会是这样的

SELECT
  *
  FROM
  your_table MATCH_RECOGNIZE (
    PARTITION BY region
    ORDER BY day_of_calendar
    MEASURES
      nvl(SUM(up.sales),0) AS tot
    ALL ROWS PER MATCH
  PATTERN ( up* ) DEFINE
    up AS SUM(up.sales) - up.sales <= 250
  );

【讨论】:

以上是关于如何在(Teradata)仅使用 ANSI SQL 时实现重置?的主要内容,如果未能解决你的问题,请参考以下文章

SQL/Teradata:如何返回特定值及其前面的行?

如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?

在 teradata 的 sql 语句中使用字符串立即执行

Teradata 工具使用SQL Assistant连接每次都需要重新输入口令

如何使用 ANSI SQL 创建临时表?

如何编写这两个(ANSI)SQL 查询?