postgresql Qlik Sense:理解这个求和表达式的作用

velaa5lx  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(182)

我对qlik sense非常陌生-我有一些数据库经验。我的一个队友最近辞职了,他是这段代码的主要所有者。

num(sum({1<[report_date] = {"=$(=(date((currDate))))"}>
    +1<[report_date]={"=$(date(currDate) - 7)"}>
    +1<[report_date]={"=$(date(currDate) - 30)"}>
    } anomoly_count ) / 100 )

有没有人能帮我弄明白它到底想干什么。我的理解是总结了这三天的价值观
val on currDate + val on (currDate - 7 days) + val on (curr - 30 days).
我尝试实现的是currDate上的瓦尔+过去7天的平均值+过去30天的平均值。
我尝试为上面的qlik sense查询编写数据库查询等价物,结果不匹配。即,在qlik sense Jmeter 板上呈现的值与我在数据库select语句上看到的值。
sum_count AS(SELECT SUM(anomoly_count)as sum_anomoly_count FROM“summary”WHERE report_date::date IN('2023 -05- 11','2023-05- 04','2023-04- 11')AND anomoly_count IS NOT NULL)
SELECT(sum_count.sum_anomoly_count::NUMERIC / 100)as result FROM sum_count

zynd9foi

zynd9foi1#

TLDR

我想这就是你想要的

(Avg(Aggr(Sum({1<[report_date] = {">=$(=(date((currDate) - 30))) <=$(=(date((currDate) - 7)))"}>} anomoly_count ), [report_date]))
    + Avg(Aggr(Sum({1<[report_date] = {">=$(=(date((currDate) - 7))) <$(=(date((currDate))))"}>} anomoly_count ), [report_date]))
    + Sum({1<[report_date] = {"=$(=(date((currDate))))"}>} anomoly_count )
)
/ 100

快速说明为什么应该工作

该表达式使用Aggr() function来获得每个[report_date]值的[anomoly_count]平均值之和。看来你已经把剩下的设置正确了,至少根据你的参数。

深入了解Qlik所涉及的概念

您的同事正在使用Qlik表达式的一个名为Set Analysis的功能-一种非常简单的思考方式是将其作为图表中使用的表达式的Where子句。另一种描述的方式是,您将选择“烘焙”到表达式中。集合分析(也称为“集合表达式”)放在聚合函数的开头,如Sum()Avg()
在您的示例中,这将是聚合函数:

sum( anomoly_count )

...然后这将是集合分析部分:

{1<[report_date] = {"=$(=date(currDate))"}>
    +1<[report_date] = {"=$(=date(currDate - 7))"}>
    +1<[report_date] = {"=$(=date(currDate - 30))"}>
    }

让我们注意一下,在这个例子中我们还使用了variablesdollar-sign expansion的概念。我们有一个变量currDate,它可能是用Today()Now() function设置为当天的。如果我们试图在这些双引号之间单独使用currDate,它不会做任何事情,因为Qlik只会看到一个标记或字符串-我们想要访问currDate变量的实际 * 值 *,所以我们需要使用美元符号扩展来实现。
在这里,我们还使用Date() function将今天的日期格式化为默认日期格式(否则,Qlik可能会显示一个5位数的数字,从技术上讲,这仍然是一个日期,但在这种情况下,它不会对我们有任何好处)。
这里要说明的另一点是--每行前面的1被称为Set Identifier,它告诉Qlik是否考虑用户可能做出的选择。1基本上意味着“忽略此表达式之外的所有选择”。这很重要,因为它本身...

{<[report_date] = {"=$(=date(currDate))"}>

...表示“其中[report_date]是今天的日期值”,但如果用户或图表中的另一个表达式选择100天前的[report_date]值,则该表达式将返回空集,因为默认情况下,我们会考虑用户选择的那些记录。但是,如果我们再次将1添加到开头...

{1<[report_date] = {"=$(=date(currDate))"}>

...那么这个表达式将只显示[report_date]是今天日期的记录,而不管选择了什么。
最后要考虑的是set operators的使用,在本例中是分隔集合表达式的加号+。在集合表达式中,加号是一个联合运算符,或者在某种程度上是一个大的OR
最后,下面是你的例子实际上是在说:
请给予[anomoly_count]的总和,其中[report_date]是今天的日期、7天前或30天前,而不考虑任何用户选择。

5f0d552i

5f0d552i2#

这不是完整的解决方案-但这是一个很好的起点。

num(
    sum({1<[report_date] = {">=$(=(date((currDate) - 30))) <=$(=(date((currDate) - 7)))"}>} anomoly_count )
    + sum({1<[report_date] = {">=$(=(date((currDate) - 7))) <$(=(date((currDate))))"}>} anomoly_count )
    + sum({1<[report_date] = {"=$(=(date((currDate))))"}>} anomoly_count )
) / 100

相关问题