1

任何人都可以向我解释以下代码如何执行以及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 天的数据。这个函数得到什么数据?

4

4 回答 4

3

您显然是在查询T带有列的表WIN_30_DURAGENT_MASTER_ID并且ROW_DT(以及其他)。请记住,诸如OVER,之类的关键字PARTITION表明您正在使用分析请求:此类请求允许您从其他请求中获取有关当前行的信息,使用GROUP BY其他“标准”子句编写起来会很复杂且冗长。

在这里,在给定的行上,您:

  • group ( PARTITION) by :这将获取当前AGENT_MASTER_ID的所有行TAGENT_MASTER_ID
  • 在分区中形成你ORDER的行ROW_DT
  • 此排序允许您选择当前行之前的 30 行ROW_DT:这是PRECEDING关键字的含义(0将选择当前行,相反是FOLLOWING子句)
  • 然后你在WIN_30_DUR场上做一个总和

在通常的语言中,这意味着:对于每个代理,取前 30 天的持续时间的总和。

于 2013-09-10T08:38:41.050 回答
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

于 2013-09-10T09:25:49.430 回答
0

ROWS BETWEEN 是窗口子句。它用于指定在评估分析函数时考虑哪些行。

分解条款,

  • PARTITION BY AGENT_MASTER_ID :行由 agent_master_id 分区。这意味着,在评估特定行的函数时,仅考虑那些 agent_master_id 与当前行相同的行。
  • ORDER BY ROW_DT :在每个分区中对行进行排序的列。
  • ROWS BETWEEN 30 PRECEDING AND 1 PRECEDING :这指定在每个分区中,仅考虑从当前行之前 30 的行开始的行,直到当前行之前 1 的行。基本上,前 30 行。

出于解释的目的,我们假设这就是您的表格的样子。在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

很少有其他窗口条款的例子,

  • UNBOUNDED PRECEDING 和 UNBOUNDED FOLLOWING :所有前面的行,当前行,所有后续行。
  • 2 PRECEDING 和 5 FOLLOWING :前 2 行,当前行和后 5 行。
  • 5 PRECEDING 和 CURRENT ROW :5 前行和当前行。
  • CURRENT ROW 和 1 FOLLOWING :当前行,接下来的 1 行。
  • 加窗子句是可选的。如果省略它,Oracle 中的默认值是 UNBOUNDED PRECEDING AND CURRENT ROW,它本质上给出了累计总数。

    这是一个简单的演示

于 2013-09-11T15:29:53.363 回答
0

我通过将结果分配到列表中找到了解决方案..

列表<> 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`
于 2015-01-09T05:25:35.420 回答