有人可以向我解释以下代码如何执行以及Oracle中preceding
关键字的含义是什么?
SUM(WIN_30_DUR) OVER(PARTITION BY AGENT_MASTER_ID
ORDER BY ROW_DT ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING)
嘿,谢谢你的澄清。我有一点怀疑。
如果我们从1月1日到28日有59天的数据,请说。这个函数得到了什么数据?
答案 0 :(得分:3)
您显然正在使用列T
,WIN_30_DUR
和AGENT_MASTER_ID
(以及其他)查询表ROW_DT
。请注意,OVER
,PARTITION
等关键字会显示您正在使用分析请求:此类请求允许您从其他行获取有关当前行的信息,这些信息很复杂且写入时间很长GROUP BY
或其他“标准”条款。
在这里,在给定的行上,您:
PARTITION
)AGENT_MASTER_ID
:这会获得T
的所有行,其中包含当前AGENT_MASTER_ID
ORDER
ROW_DT
行
ROW_DT
之前的30行:这是PRECEDING
关键字的含义(0
将选择当前行,相反的是{ {1}}条款)FOLLOWING
字段在通常的语言中,这意味着:对于每个代理人,请考虑前30天的持续时间总和。
答案 1 :(得分:0)
select row_dt, win_30_dur,
agent_master_id,
SUM(WIN_30_DUR) OVER(PARTITION BY AGENT_MASTER_ID
ORDER BY ROW_DT ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING) running_sum
from test;
它使用ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING
将结果返回到当前行。 ,由AGENT_MASTER_ID
排序的表格中的ROW_DT
列进行分区。
因此,在您的查询中,它返回AGENT_MASTER_ID
的值之和,该值位于当前行之上30行和1行之间。
为了更好地理解:请参阅此处:http://sqlfiddle.com/#!4/ce6b4/4/0
答案 2 :(得分:0)
ROWS BETWEEN是窗口问题。它用于指定在评估分析函数时考虑哪些行。
细分条款,
出于解释目的,我们假设这是您的表格的样子。在sum_as_analytical
下我已经提到了在计算SUM时包含哪些行。
agent_master_id win_30_dur row_dt sum_as_analytical
---------------------------------------------------------------------
1 12 01-01-2013 no preceding rows. Sum is null
1 10 02-01-2013 only 1 preceding row. sum = 12
1 14 03-01-2013 only 2 preceding rows. sum = 12 + 10
1 10 04-01-2013 3 preceding rows. sum = 12 + 10 + 14
. .
. .
. .
1 10 30-01-2013 29 preceding rows. sum = 12 + 10 + 14 .... until value for 29-01-2013
1 10 31-01-2013 30 preceding rows. sum = 12 + 10 + 14 .... until value for 30-01-2013
1 20 01-02-2013 30 preceding rows. sum = 10 + 14 + 10 .... until value for 31-01-2013
. .
. .
. .
1 10 28-02-2013 30 preceding rows. sum = sum of values from 29th Jan to 27th FeB
2 10 01-01-2013 no preceding rows. Sum is null
2 15 02-01-2013 only 1 preceding row. sum = 10
2 14 03-01-2013 only 2 preceding rows. sum = 10 + 15
2 12 04-01-2013 3 preceding rows. sum = 10 + 15 + 14
. .
. .
. .
2 23 31-01-2013 30 preceding rows. sum = 10 + 15 + 14 .... until value for 30-01-2013
2 12 01-02-2013 30 preceding rows. sum = 15 + 14 + 12 .... until value for 31-01-2013
. .
. .
. .
2 25 28-02-2013 30 preceding rows. sum = sum of values from 29th Jan to 27th FeB
关于窗口问题的其他几个例子,
窗口子句是可选的。如果省略它,Oracle中的默认值是UNBOUNDED PRECEDING AND CURRENT ROW,它基本上给出累计总数。
这是一个简单的demo。
答案 3 :(得分:0)
我通过将结果分配到列表中找到了解决方案..
列表与LT;> BOS = Orders1.ToList<>();
decimal running_total = 0;
var result_set =
from x in BOS
select new
{
DESKTOPS = x.NOTEBOOKS,
running_total = (running_total = (decimal)(running_total + x.NOTEBOOKS))
};`enter code here`