有没有办法使用Over和Intersect函数来获得每个Employee的前3个时段(不总是连续几个月,有时一个月被跳过)的平均销售额?
例如:
我使用DenseRank over Date,“asc”,EmpID然后使用另一个布尔计算列,其中DenseRank列名称为< = 3,然后使用Over函数覆盖Boolean = TRUE专栏,但我想找出正确的方法来做到这一点。
有最后'n'期间功能,但我没有看到任何类似于'n'期间功能的东西。
EmpID Date Sales
1 1/1/2007 80
1 2/1/2007 60
1 4/1/2007 75
1 5/1/2007 30
1 9/1/2007 100
2 2/1/2007 200
2 3/1/2007 100
3 12/1/2006 350
3 1/1/2007 250
3 3/1/2007 150
3 4/1/2007 275
3 8/1/2007 375
3 9/1/2007 475
3 10/1/2007 300
3 12/1/2007 200
答案 0 :(得分:1)
我认为解决方案取决于您希望此数据表示的位置,但这是一个示例
If((Rank([Date],"asc",[EmpID])<=3) and (Max(Rank([Date],"asc",[EmpID])) OVER ([EmpID])>=3),Avg([Sales]) over ([EmpID]))
您可以将其作为计算列插入,它会为您提供所需内容(假设您的数据按导入时的日期排序)。
您可能希望查看行编号,在这种情况下,也要将其作为计算列插入并命名为RN
Rank([Date],"asc",[EmpID])
<强>解释强>
Rank([Date],"asc",[EmpID])
此部分功能基本上是将行号(在下面的结果中标记为RN
)应用于每个EmpID
分组。
Rank([Date],"asc",[EmpID])<=3
无论是否跳过月份,这都是我们排在前3行的方式。如果您的数据没有排序,我们必须创建一个额外的计算列,但适用相同的逻辑。
(Max(Rank([Date],"asc",[EmpID])) OVER ([EmpID])>=3)
这是我们基本上忽略EmpID = 2
或任何没有至少3行的EmpID
的地方。删除此选项将分别根据前一个,两个月或三个月的每个EmpID
为您提供平均值(动态)。
Avg([Sales]) over ([EmpID])
现在我们的数据仅限于我们关注的行,只需取每个EmpID
的平均值。
答案 1 :(得分:1)