Qlik Sense :use Peek function to Group by and Get Rowno

2024-04-12 08:28

本文主要是介绍Qlik Sense :use Peek function to Group by and Get Rowno,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Question

Row number based on groups of data

Calculate row number for groups

有时候我们需要基于分组来对数据进行内部排序,例如一个id+date,把不同的属性的记录标记为123,又或者把重复记录标记出来

Solved: Calculate row number for groups - Qlik Community - 54864

Solution: Group by and Get Rowno

source data like below , we want to group by pool_id and balance_date then give it the RowNo

PoolDataTmp1:LOAD * inline [Pool_ID|Account_ID|Balance_DateP0001|ACC0011|2024-04-11
P0001|ACC0012|2024-04-11
P0001|ACC0013|2024-04-11
P0001|ACC0011|2024-04-10
P0001|ACC0012|2024-04-10
P0002|ACC0021|2024-05-01
P0002|ACC0022|2024-05-01
P0002|ACC0023|2024-05-01
P0002|ACC0023|2024-05-01] (delimiter is '|');PoolDataTmp2:
Load Hash128(Pool_ID,Balance_Date) as MyKey,*
Resident 
PoolDataTmp1
;drop table PoolDataTmp1;left join(PoolDataTmp2)
Load IF(MyKey <> Previous(MyKey), 1, Peek('GroupRow')+1) AS GroupRow,MyKey,Account_IDResident 
PoolDataTmp2
Order By MyKey;Exit Script;

Result: group by pool_id and balance_date , give the every record a (Group)RowNo

extend : use it to mark duplicate record by key

if you modify the key to Load Hash128(Pool_ID,Balance_Date,Account_ID) as MyKey,* 

then you could use it to check if any duplicate result

 

 

 

Peek - 脚本函数

Peek() 用于在表格中返回已经加载行的字段值。可以将行号指定为表格。如果未指定行号,将使用上次加载的记录。

peek() 函数最常用于查找以前加载的表中的相关边界,即特定字段的第一个值或最后一个值。在大多数情况下,该值存储在一个变量中供以后使用,例如,作为 do-while 循环中的一个条件

语法:  

Peek( field_name [, row_no[, table_name ] ])

返回数据类型: 双

参数:  

参数
参数说明
field_name需要返回值的字段的名称。输入值必须为字符串(例如引用的文字)。
row_no

表格中的行用于指定所需的字段。可以是表达式,但解算结果必须为整数。0 表示第一个记录,1 表示第二个记录,以此类推。负数表示从表格末端开始计算的顺序。-1 表示最后读取的记录。

如果未指定row_no,则假定为 -1。

table_name表格标签不能以冒号结束。如果未指定table_name,则假定为当前表格。如果用于 LOAD 语句之外或指向另外一个表格,则必须包括 table_name。

限制:  

该函数只能从已加载的记录中返回值。这意味着在表的第一条记录中,使用 -1 作为 row_no 的调用将返回 NULL。

示例和结果:

示例 1

将示例脚本添加到应用程序并运行。要查看结果,将结果列中列出的字段添加到应用程序中的工作表。

EmployeeDates:
Load * Inline [
EmployeeCode|StartDate|EndDate
101|02/11/2010|23/06/2012
102|01/11/2011|30/11/2013
103|02/01/2012|
104|02/01/2012|31/03/2012
105|01/04/2012|31/01/2013
106|02/11/2013|
] (delimiter is '|');First_last_Employee:
Load 
EmployeeCode, 
Peek('EmployeeCode',0,'EmployeeDates') As FirstCode, 
Peek('EmployeeCode',-1,'EmployeeDates') As LastCode
Resident EmployeeDates;
结果表
员工代码StartDateEndDateFirstCodeLastCode

101

02/11/201023/06/2012101106
10201/11/201130/11/2013101106
10302/01/2012101106
10402/01/201231/03/2012101106
10501/04/201231/01/2013101106
10602/11/2013101106

FirstCode = 101,因为 Peek('EmployeeCode',0, 'EmployeeDates') 返回表格 EmployeeDates 的 EmployeeCode 中的第一个值。

LastCode = 106,因为 Peek('EmployeeCode',-1, 'EmployeeDates') 返回表格 EmployeeDates 的 EmployeeCode 中的最后一个值。

替代参数 row_no 返回表格中其他行的值,如下所示:

Peek('EmployeeCode',2, 'EmployeeDates') 用于返回表格中的第三个值 103(作为 FirstCode)。

但是,请注意,如果在这些示例中没有将表格指定为第三个参数 table_name,此函数引用当前表格(在此例中,为内部表格)。

示例 2

如果要访问表中更深层的数据,需要分两步进行:首先,将整个表加载到临时表中,然后在使用 Peek() 时对其重新排序。

将示例脚本添加到应用程序并运行。要查看结果,将结果列中列出的字段添加到应用程序中的工作表。

T1:
LOAD * inline [
ID|Value
1|3
1|4
1|6
3|7
3|8
2|1
2|11
5|2
5|78
5|13
] (delimiter is '|');T2:LOAD *,
IF(ID=Peek('ID'), Peek('List')&','&Value,Value) AS List
RESIDENT T1
ORDER BY ID ASC;
DROP TABLE T1;
结果表
ID列表
13,44
13,4,66
133
21,1111
211
37,88
377
52,7878
52,78,1313
522

IF() 语句是根据临时表格 T1 构建。
Peek('ID') 引用当前表格 T2 的上一行中的字段 ID。
Peek('List') 引用当前表格 T2 的上一行中的字段 List,目前正在构建要解算的表达式。

如下运算语句:
如果 ID 的当前值与 ID 的上一个值相同,则写入 Peek('List') 的值串联 Value 的当前值。否则,只写入 Value 的当前值。

如果 Peek('List') 已经包含串联结果,则会将 Peek('List') 的新结果串联至其当前值。

信息注释注意,Order by 子句。该子句用于指定表格的排序方式(按 ID 进行升序排序)。如果没有使用此子句,Peek() 函数将使用内部表格拥有的任意排序方式,这可能会导致产生不可预测的结果。

示例 3

将示例脚本添加到应用程序并运行。要查看结果,将结果列中列出的字段添加到应用程序中的工作表。

Amounts:
Load 
Date#(Month,'YYYY-MM') as Month,
Amount,
Peek(Amount) as AmountMonthBefore 
Inline
[Month,Amount
2022-01,2
2022-02,3
2022-03,7
2022-04,9
2022-05,4
2022-06,1];
结果表
金额AmountMonthBefore
142022-06
2-2022-01
322022-02
492022-05
732022-03
972022-04

字段 AmountMonthBefore 将保存上个月的金额。

这里省略了 row_no 和 table_name 参数,因此使用默认值。在本例中,以下三个函数调用是等效的:

  • Peek(Amount)
  • Peek(Amount,-1)
  • Peek(Amount,-1,'Amounts')

将 -1 用作 row_no 并不意味着将使用前一行中的值。通过替换该值,可以获取表中其他行的值:

Peek(Amount,2) 用于返回表格中的第三个值:7。

示例 4:

数据需要正确排序才能得到正确的结果,但遗憾的是,情况并非总是如此。此外,Peek() 函数不能用于引用尚未加载的数据。通过使用临时表并对数据进行多次传递,可以避免此类问题。

将示例脚本添加到应用程序并运行。要查看结果,将结果列中列出的字段添加到应用程序中的工作表。

tmp1Amounts:
Load * Inline
[Month,Product,Amount
2022-01,B,3
2022-01,A,8
2022-02,B,4
2022-02,A,6
2022-03,B,1
2022-03,A,6
2022-04,A,5
2022-04,B,5
2022-05,B,6
2022-05,A,7
2022-06,A,4
2022-06,B,8];tmp2Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthBefore
Resident tmp1Amounts
Order By Product, Month Asc; 
Drop Table tmp1Amounts;Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthAfter
Resident tmp2Amounts
Order By Product, Month Desc; 
Drop Table tmp2Amounts;

解释

初始表是按月份排序的,这意味着 peek() 函数在很多情况下会返回错误产品的金额。因此,该表需要重新排序。这是通过运行第二次数据传递并创建一个新表来完成的。注意,Order by 子句。它先按产品将记录排序,然后按月份升序排序。

需要 If() 函数,因为如果前一行包含同一产品但属于上一个月的数据,则只应计算 AmountMonthBefore。通过将当前行的产品与前一行的产品进行比较,可以验证此条件。

创建第二个表时,使用 Drop 创建第二个表时,使用Drop Table 语句删除第一个表。

最后,对数据进行第三次遍历,但现在月份的排序是相反的。这样,也可以计算 AmountMonthAfter。

信息注释Order by子句指定表格的排序方式;如果没有使用这些子句,Peek() 函数将使用内部表格拥有的任意排序方式,这可能会导致产生不可预测的结果。

结果

结果表
产品金额AmountMonthBeforeAmountMonthAfter
2022-01A8-6
2022-02B3-4
2022-03A686
2022-04B431
2022-05A665
2022-06B145
2022-01A567
2022-02B516
2022-03A754
2022-04B658
2022-05A47-
2022-06B86-

示例 5

将示例脚本添加到应用程序并运行。要查看结果,将结果列中列出的字段添加到应用程序中的工作表。

T1:
Load * inline [
Quarter, Value
2003q1, 10000
2003q1, 25000
2003q1, 30000
2003q2, 1250
2003q2, 55000
2003q2, 76200
2003q3, 9240
2003q3, 33150
2003q3, 89450
2003q4, 1000
2003q4, 3000
2003q4, 5000
2004q1, 1000
2004q1, 1250
2004q1, 3000
2004q2, 5000
2004q2, 9240
2004q2, 10000
2004q3, 25000
2004q3, 30000
2004q3, 33150
2004q4, 55000
2004q4, 76200
2004q4, 89450 ];T2:
Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal;
Load Quarter, sum(Value) as SumVal resident T1 group by Quarter;

结果

结果表
季度SumValAccSumVal
2003q16500065000
2003q2132450197450
2003q3131840329290
2003q49000338290
2004q15250343540
2004q224240367780
2004q388150455930
2004q4220650676580

解释

Load 语句 Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal 包括一个递归调用,其中以前的值被添加到当前值。此操作用于计算脚本中值的累积。

这篇关于Qlik Sense :use Peek function to Group by and Get Rowno的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896614

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

js私有作用域(function(){})(); 模仿块级作用域

摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: for(var i=0;i<10;i++){alert(i);}alert(i); for循环后的i,在其它语言像c、java中,会在for结束后被销毁,但js在后续的操作中仍然能访

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w

API28_OKgo_get注意事项

1: implementation 'com.lzy.net:okgo:2.1.4' 2:在BaseApplication中onCreate()中初始化initOKgo() private void initOKgo() {//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//HttpHeaders headers

rtklib.h : RTKLIB constants, types and function prototypes 解释

在 RTKLIB 中,rtklib.h 是一个头文件,包含了与 RTKLIB 相关的常量、类型和函数原型。以下是该头文件的一些常见内容和翻译说明: 1. 常量 (Constants) rtklib.h 中定义的常量通常包括: 系统常量: 例如,GPS、GLONASS、GALILEO 等系统的常量定义。 时间常量: 如一年、一天的秒数等。 精度常量: 如距离、速度的精度标准。 2. 类型

项目一(一) HttpClient中的POST请求和GET请求

HttpClient中的POST请求和GET请求 一、HttpClient简述 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLU

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看