我试图解决的问题是让SAP Business Objects查询为我计算变量,因为在一个大的excel文件中计算它会导致进程崩溃。
我有一堆包含每日/每周数据的列。我想得到一个" 1"对于一周内名称/人物/某些识别器的第一个实例和" 0"所有其余的。
例如,如果项目" Glass"在第4周出售5次此变量/列第一次销售将获得" 1"接下来的4个销售将获得" 0"。这将允许我在特定的一周内销售不同商品的数量。
我知道Business Objects中有Count和Count不同的功能,但我更喜欢将这个1/0系统用于整个原始数据表,因为我将它用作整个仪表板的源,并且有很多指标,其中distinct将是part / slicer。
我以前做的方式是使用excel公式:= IF(SUMPRODUCT(($ A $ 2:$ A5000 = $ A2)*($ G $ 2:$ G5000 = $ G2))> 1,0,1 )
这就是诀窍并给出了一个" 1"对于列G中第一个值的实例,出现在A列的某个值范围内(A列是星期)并给出" 0"当相同的值重新出现在A列中的相同周值时。它将给出" 1"当周值改变时再次。
由于随着数据变大,每行比较两行中的2个单元格,因此这会导致崩溃。
到目前为止,我无法在Business Objects中模仿这一点,我认为我已经耗尽了我的能力和谷歌搜索。
有人可以分享他们的两分钱吗?
答案 0 :(得分:1)
我认为你想要围绕row_number()
的逻辑:
select t.*,
(case when 1 = row_number() over (partition by name, person, week, identifier
order by ??
)
then 1 else 0
end) as new_indicator
from t;
请注意??
。 SQL表表示无序集。除非列指定了排序,否则表或行组中没有“第一”行。 ??
用于此类列(可能是日期/时间列,可能是id)。
如果您只想标记一行,则可以在其中放置任何内容,例如order by (select null)
或order by week
。
答案 1 :(得分:1)
假设您在查询中有一个唯一标识行的对象,您可以通过几个简单的步骤完成此操作。
假设您的查询包含以下对象:
altparallel="$HOME/newnnm/parallel"
if command -v parallel >/dev/null 2>&1; then
parallel "$@"
elif [[ -x "$altparallel" ]]; then
"$altparallel" "$@"
else
exit 1
fi
您希望在每个姓名/周#的第一次出现时显示1。
步骤1:使用以下定义创建变量。我们称之为Sale ID
Name
Person
Sale Date
Week #
Price
etc.
[FirstOne]
步骤2:在报告栏中,添加一个包含以下公式的列:
=Min([Sale ID]) In ([Name];[Week #])
这应该在行中产生1,表示在一周#中第一次出现Name。如果你想在第一次出现Name / Person / Week#时显示1,你可以相应地修改[FirstOne]变量:
=If [FirstOne] = [Sale ID] Then 1 Else 0