如何在(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 时实现重置?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?