“先行”在Oracle中意味着什么?

时间:2013-09-10 07:16:38

标签: oracle

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

4 个答案:

答案 0 :(得分:3)

您显然正在使用列TWIN_30_DURAGENT_MASTER_ID(以及其他)查询表ROW_DT。请注意,OVERPARTITION等关键字会显示您正在使用分析请求:此类请求允许您从其他行获取有关当前行的信息,这些信息很复杂且写入时间很长GROUP BY或其他“标准”条款。

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

  • 分组PARTITIONAGENT_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是窗口问题。它用于指定在评估分析函数时考虑哪些行。

细分条款,

  • PARTITION BY AGENT_MASTER_ID:行由agent_master_id分区。这意味着,在评估特定行的函数时,只考虑那些具有与当前行相同的agent_master_id的行。
  • ORDER BY ROW_DT:在每个分区中按行排序的列。
  • 30前置和前置之间的行:这指定在每个分区内,仅考虑从当前行之前的行开始的那些行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行和当前行。
  • 当前行和1个以下:当前行,后续行1。
  • 窗口子句是可选的。如果省略它,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`