任何人都可以向我解释以下代码如何执行以及precedingOracle中关键字的含义是什么?
SUM(WIN_30_DUR) OVER(PARTITION BY AGENT_MASTER_ID
ORDER BY ROW_DT ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING)
嘿,谢谢你的澄清。我有一个小小的疑问。
假设我们从 1 月 1 日到 2 月 28 日有 59 天的数据。这个函数得到什么数据?
任何人都可以向我解释以下代码如何执行以及precedingOracle中关键字的含义是什么?
SUM(WIN_30_DUR) OVER(PARTITION BY AGENT_MASTER_ID
ORDER BY ROW_DT ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING)
嘿,谢谢你的澄清。我有一个小小的疑问。
假设我们从 1 月 1 日到 2 月 28 日有 59 天的数据。这个函数得到什么数据?
您显然是在查询T带有列的表WIN_30_DUR,AGENT_MASTER_ID并且ROW_DT(以及其他)。请记住,诸如OVER,之类的关键字PARTITION表明您正在使用分析请求:此类请求允许您从其他请求中获取有关当前行的信息,使用GROUP BY其他“标准”子句编写起来会很复杂且冗长。
在这里,在给定的行上,您:
PARTITION) by :这将获取当前AGENT_MASTER_ID的所有行TAGENT_MASTER_IDORDER的行ROW_DTROW_DT:这是PRECEDING关键字的含义(0将选择当前行,相反是FOLLOWING子句)WIN_30_DUR场上做一个总和在通常的语言中,这意味着:对于每个代理,取前 30 天的持续时间的总和。
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
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,它本质上给出了累计总数。
这是一个简单的演示。
我通过将结果分配到列表中找到了解决方案..
列表<> 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`