我正在使用SQL Server 2012构建库存计划/重新排序引擎。
我有一堆过时的交易,称它们为贷方和借方。我想一次做两件事:
该表如下所示:
CREATE TABLE TX (TDate DATETIME, Qty INT);
INSERT INTO TX VALUES ('2014-03-01', 20);
INSERT INTO TX VALUES ('2014-03-02',-10);
INSERT INTO TX VALUES ('2014-03-03',-20);
INSERT INTO TX VALUES ('2014-03-04',-10);
INSERT INTO TX VALUES ('2014-03-05', 30);
INSERT INTO TX VALUES ('2014-03-06',-20);
INSERT INTO TX VALUES ('2014-03-07', 10);
INSERT INTO TX VALUES ('2014-03-08',-20);
INSERT INTO TX VALUES ('2014-03-09', -5);
我正在使用SQL 2012 SUM OVER()窗口函数来显示这些的运行总数。
select TDate, Qty, RunningTotal, RecommendedReplenish from (
select
TDate,
Qty,
SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) as RunningTotal,
-1 * (CASE WHEN Qty < 0 AND SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) < 0
THEN
CASE WHEN Qty > SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) THEN Qty ELSE SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) END
ELSE 0 END) as RecommendedReplenish
/* Wrong, does not account for balance resetting to zero */
from TX
) T order by TDate
我需要找到一种方法将运行总计(又称RT)重置为零(如果下降到零以下)。
我的查询中Qty和RT均为负数,并将其中较大(较小的负数)作为第一个建议的补货。第一次可以正常运行。
我不确定如何从窗口运行总计中扣除这一点。如果可能的话,我想在一个语句中执行此操作。
以下是我要查找的输出的摘要:
TDate Qty R.Tot Replenish New RT
----------- ---- ----- ----------- ---------
3/1/2014 20 20 20
3/2/2014 -10 10 10
3/3/2014 -20 -10 10 0
3/4/2014 -10 -20 10 0
3/5/2014 30 10 30
3/6/2014 -20 -10 10
3/7/2014 10 0 20
3/8/2014 -20 -20 0
3/9/2014 - 5 -25 5 0
Itzik Ben-Gan,Joe Celko或其他SQL英雄,您在那里吗?:)
提前致谢!
这可以使用基于集合的解决方案来完成:
1,计算出正常的跑步总数(称为RT)
2.计算RT的最小运行时间(称其为MN)
当MN为负时,-MN是您到目前为止必须补充的总量。当MN为负时,使replenish_rt为-MN。因此,新的运行总计(称为new_rt)为rt +
replenish_rt。并且,如果您需要返回当前所需的补货数量,请从当前值中减去以前的replenish_rt(使用LAG)。
这是完整的解决方案查询:
with c1 as
(
select *,
sum(qty) over(order by tdate rows unbounded preceding) as rt
from tx
),
c2 as
(
select *,
-- when negative, mn is the total qty that had to be
-- replenished until now, inclusive
min(rt) over(order by tdate rows unbounded preceding) as mn_cur
from c1
)
select tdate, qty, rt,
replenish_rt - lag(replenish_rt, 1, 0) over(order by tdate) as replenish,
rt + replenish_rt as new_rt
from c2
cross apply(values(case when mn_cur < 0 then -mn_cur else 0 end)) as a1(replenish_rt);
问题内容: 我有一张桌子,上面有日期和交易记录。我需要计算运行总计(用总和划分很容易),除了当“金额”中存在负值时需要将其重置为零,然后再次开始计算运行总计。有任何想法吗? 问题答案: 使用更新变量方法,您可以使用重置选项计算运行总计。
问题内容: 我正在探索Hive中的窗口功能,并且能够理解所有UDF的功能。虽然,我无法理解我们与其他功能配合使用的分区和顺序。以下是与我计划构建的查询非常相似的结构。 只是试图了解两个关键字都涉及的后台过程。 感谢帮助:) 问题答案: 分析函数为数据集中每个分区的每一行分配一个等级。 子句确定行的分布方式(如果是配置单元,则在缩减程序之间)。 确定行在分区中的排序方式。 第一阶段由分配 ,数据集中
问题内容: 运行以下代码: 结果是: 上面的代码中没有定义任何窗口框架,它看起来默认的窗口框架是 不确定我对默认窗口框架的理解是否正确 问题答案: 从Spark Gotchas 默认帧规格取决于给定窗口定义的其他方面: 如果指定了ORDER BY子句,并且该函数接受了帧规范,则该帧规范是由RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义的, 否
我试图在火花数据帧中使用rowNumber。我的查询在Spark shell中按预期工作。但是当我在eclipse中写出它们并编译一个jar时,我面临着一个错误 我的问题 在Spark shell中运行查询时,我没有使用HiveContext。不确定为什么它返回一个错误,当我运行相同的jar文件。如果有帮助的话,我也在Spark 1.6.0上运行脚本。有人面临类似的问题吗?
我每年都通过联接进行
问题内容: 我有一个事件表,其中包含以下字段: 给定一个持续时间和一个数字,我需要在持续时间的任何相对时间窗口中,对所有大于事件的事件进行计数。这基本上需要针对每个事件的滑动窗口。例如,我希望所有event_type在10分钟的持续时间内具有超过5个事件的活动。 我不确定如何在没有窗口功能的情况下解决此问题。 (我使用的是mysql 5.6。我在说的是一百万行以下的数据集。) 问题答案: MySQ