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_Date

P0001|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_ID

Resident 
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 包括一个递归调用,其中以前的值被添加到当前值。此操作用于计算脚本中值的累积。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535749.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS安装openMP报错【已解决】

error: Target “WLBG” links to: OpenMP::OpenMP_CXX but the target was not found. Possible reasons include: * There is a typo in the target name. * A find_package call is missing for an IMPORTED target. * An ALIAS target is missing. 最开始是报这个错&#x…

云上配置Hadoop环境

Hadoop概述 Hadoop技术主要是由下面这三个组件组合而成的&#xff1a; HDFS是一个典型的主从模式架构。 HDFS的基础架构 HDFS的集群搭建 一点准备工作 其实这一块没啥内容&#xff0c;就是将Hadoop官网下载下来的Hadoop的tar包上传到我们服务器上的文件目录下&#xff1a; …

2024考研调剂须知

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

Vue ElementUI el-input-number 改变控制按钮 icon 箭头为三角形

el-input-number 属性 controls-position 值为 right 时&#xff1b; <el-input-number v-model"num" controls-position"right" :min"1" :max"10"></el-input-number>原生效果 修改后效果 CSS 修改 .el-input-number…

点亮一颗 LED: 单片机 ch32v003 (RISC-V) 使用 rust 编写固件

首发日期 2024-04-09, 以下为原文内容: 使用 rust 编写单片机的程序 ? 很新, 但没问题. 使用 RISC-V CPU 的单片机 (比如 ch32v003) ? 也没问题. 同时使用 ? 哦嚯, 问题出现了 !! ch32v003 是一款使用 rv32ec 指令集的国产单片机, 很便宜 (某宝零卖只要 0.4 元一个, 在同档…

学习JavaEE的日子 Day33 File类,IO流

Day33 1.File类 File是文件和目录路径名的抽象表示 File类的对象可以表示文件&#xff1a;C:\Users\Desktop\hhy.txt File类的对象可以表示目录路径名&#xff1a;C:\Users\Desktop File只关注文件本身的信息&#xff08;文件名、是否可读、是否可写…&#xff09;&#xff0c…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

如何使用pgvector为RDS PostgreSQL构建专属ChatBot?

背景 越来越多的企业和个人希望能够利用LLM和生成式人工智能来构建专注于其特定领域的具备AI能力的产品。目前&#xff0c;大语言模型在处理通用问题方面表现较好&#xff0c;但由于训练语料和大模型的生成限制&#xff0c;对于专业知识和时效性方面存在一些局限。在信息时代&…

缓存穿透、缓存雪崩、缓存击穿的区别

缓存三兄弟&#xff08;穿透、雪崩、击穿&#xff09; 缓存穿透 定义 查询一个redis和数据库都不存在的值&#xff0c;数据库不存在则不会将数据写入缓存&#xff0c;所以这些请求每次都达到数据库。 解决办法是缓存空对象&#xff0c;如果数据库不存在则将空对象存入缓存&…

Python数据结构与算法——算法(贪心算法、动态规划

贪心算法 介绍&#xff1a;贪心算法又称贪婪算法&#xff0c;是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;它所做出的是在某种意义上的局部最优解。 贪心算法并不保证会得到最优解&#xff0c;但…

qemu源码解析(基于qemu9.0.0)

简介 QEMU是一个开源的虚拟化软件&#xff0c;它能够模拟各种硬件设备&#xff0c;支持多种虚拟化技术&#xff0c;如TCG、Xen、KVM等 TCG 是 QEMU 中的一个组件&#xff0c;它可以将高级语言编写的代码&#xff08;例如 C 代码&#xff09;转换为可在虚拟机中执行的低级代码…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

Day21_学点儿JavaEE__过滤器Filter(登录验证、编码处理)

1 为什么要使用过滤器 昨天已经总结过 当然&#xff0c;这仅仅是完成了一个简单的登录过程&#xff0c;即完成判断输入信息是否和数据库信息相匹配的操作&#xff0c;但是仍然可以通过直接输入地址的方式&#xff0c;在不登录的情况下访问相应的页面。而我们实际生活中的没登录…

ASUS华硕ROG幻16Air笔记本电脑GU605M原装出厂Win11系统工厂包下载,带有ASUSRecovery一键重置还原

适用型号&#xff1a;GU605MI、GU605MY、GU605MZ、GU605MV、GU605MU 链接&#xff1a;https://pan.baidu.com/s/1YBmZZbTKpIu883jYCS9KfA?pwd9jd4 提取码&#xff1a;9jd4 华硕原厂Windows11系统带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性联机支持…

谷歌查问题

1&#xff0c;打开 it工具箱-里面啥都有 2&#xff0c;找到谷歌 3&#xff0c;访问gpt

跟TED演讲学英文:The next grand challenge for AI by Jim Fan

The next grand challenge for AI Link: https://www.ted.com/talks/jim_fan_the_next_grand_challenge_for_ai? Speaker: Jim Fan Date: October 2023 文章目录 The next grand challenge for AIIntroductionVocabularyTranscriptSummary后记 Introduction Researcher Jim…

深入理解MD5算法:原理、应用与安全

title: 深入理解MD5算法&#xff1a;原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章&#xff1a;引言 导言 在当今数字化时代&#xff0c;数据安全和完整性变得至关重要。消息…

PHP婚恋小程序开发源码支持微信+公众号+APP

随着社会的发展和人们生活节奏的加快&#xff0c;传统的相亲方式已经不能满足现代人的需求。在此背景下&#xff0c;有人想到通过线上小程序的方式来满足更多的人进行相亲&#xff0c;所以在此情况下&#xff0c;婚恋相亲小程序由此出现。婚恋相亲小程序的功能有会员功能&#…