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

news2024/11/27 6:16:50

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现word一键注音?给一篇word文章快速注音的方法

在日常生活和工作中&#xff0c;我们经常需要处理各种文档&#xff0c;其中不乏包含大量生僻字或需要标注拼音的文本。手动为每一个字添加拼音不仅效率低下&#xff0c;而且容易出错。那么&#xff0c;有没有一种方法可以实现Word文档的一键注音呢&#xff1f;本文将为大家详细…

基于SpringBoot和Vue的企业客户管理系统

今天要和大家聊的是基于SpringBoot和Vue的企业客户管理系统 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前&#xff08;idea默认字体为 JetBrains Mono&#xff09; 2.设置后&#xff08;楷体&#xff09;

Oracle 19c补丁升级(Windows)

文章目录 一、打补丁前备份检查1、补丁包获取2、备份数据包以及数据库软件3、检查OPatch版本 二、补丁升级1、更新OPatch2、关闭监听以及服务3、补丁升级过程4、启动监听以及服务 三、数据库补丁应用 一、打补丁前备份检查 1、补丁包获取 补丁包&#xff1a; 百度网盘链接&am…

贪心算法:排列算式

题目描述 给出n数字&#xff0c;对于这些数字是否存在一种计算顺序&#xff0c;使得计算过程中数字不会超过3也不会小于0&#xff1f; 输入描述: 首行给出一个正整数t,(1≤t≤1000)代表测试数据组数每组测试数据第一行一个正整数n,(1≤n≤500)第二行包含n个以空格分隔的数字…

CLIPSeg如果报“目标计算机积极拒绝,无法连接。”怎么办?

CLIPSeg这个插件在使用的时候&#xff0c;偶尔会遇到以下报错&#xff1a; Error occurred when executing CLIPSeg: (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /CIDAS/clipseg-rd64-refined/resolve/main/toke…

练习题(2024/4/11)

1每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入…

使用 vue3-sfc-loader 加载远程Vue文件, 在运行时动态加载 .vue 文件。无需 Node.js 环境,无需 (webpack) 构建步骤

加载远程Vue文件 vue3-sfc-loader vue3-sfc-loader &#xff0c;它是Vue3/Vue2 单文件组件加载器。 在运行时从 html/js 动态加载 .vue 文件。无需 Node.js 环境&#xff0c;无需 (webpack) 构建步骤。 主要特征 支持 Vue 3 和 Vue 2&#xff08;参见dist/&#xff09;仅需…

订单中台架构:打造高效订单管理系统的关键

在现代商业环境下&#xff0c;订单管理对于企业来说是至关重要的一环。然而&#xff0c;随着业务规模的扩大和多渠道销售的普及&#xff0c;传统的订单管理方式往往面临着诸多挑战&#xff0c;如订单流程复杂、信息孤岛、数据不一致等问题。为了应对这些挑战并抓住订单管理的机…

Redis 的数据结构和内部编码

Redis的 5 种数据类型 Redis 底层在实现上述数据结构的时候&#xff0c;会在源码层面&#xff0c;针对上述实现进行 特定的优化 &#xff0c;来达到节省时间/节省空间效果 特定的优化&#xff1a;内部的具体实现的数据结构&#xff0c;在特定场景下&#xff0c;不是其对应的标准…

【HTML】制作一个简单的线性动画

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;两个文件夹&#xff0c;其中HTML的文件名改为[index.html]&am…

TFT显示屏驱动

REVIEW 已经学习过VGA 时序与实现-CSDN博客 VGA 多分辨率-CSDN博客 今天就来让TFT屏显示一下 小梅哥视频&#xff1a;24 RGB TFT显示屏原理与驱动实现_哔哩哔哩_bilibili 1. 设置显示屏参数与时钟 注意到VGA_parameter.v中&#xff0c;不懂得分辨率对应于不同的频率&#xff…

Vue3学习04 组件通信

Vue3学习04 组件通信 组件通信props 父 ↔ 子自定义事件 子 > 父mitt 任意组件间通信v-model 父↔子$attrs 祖↔孙$refs、$parent案例的完整代码ref注意点 provide、inject 祖↔孙piniaslot① 默认插槽② 具名插槽③ 作用域插槽 组件通信 Vue3组件通信和Vue2的区别&#xf…

K8S之Controller

我们在回顾下pod的启动流程&#xff1a; 用户通过kubectl&#xff0c;向api-server 发起请求api-server接受请求&#xff0c;并将数据写入etcdkube-scheduler通过watch检测到未绑定node 的pod&#xff0c;调度pod到某一node上&#xff0c;并通知给api-server&#xff0c;api-se…

Centos7 k8s 集群 - Rook Ceph 安装

环境准备 基础环境 系统名称操作系统CPU内存硬盘Kubernete 版本Docker版本IPmasterCentos74c4gsdb 20G1.17.023.0.1192.168.1.128node01Centos74c4gsdb 20G1.17.023.0.1192.168.1.129node02Centos74c4gsdb 20G1.17.023.0.1192.168.1.130node03Centos74c4gsdb 20G1.17.023.0.1…

计算两个时间段的差值

计算两个时间段的差值 运行效果&#xff1a; 代码实现&#xff1a; #include<stdio.h>typedef struct {int h; // 时int m; // 分int s; // 秒 }Time;void fun(Time T[2], Time& diff) {int sum_s[2] { 0 }; for (int i 0; i < 1; i) { // 统一为秒数sum_s[…

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…

绝地求生:PUBG×杜卡迪联名上线!参与投稿评论赢取精美好礼

PUBG杜卡迪联名活动游戏内现已正式上线&#xff01;我们诚邀与您一起在开拓未知战场和书写新历史的过程中&#xff0c;与杜卡迪一同实现您的极速梦想&#xff01; 在本次的杜卡迪工坊中&#xff0c;更是包含了具备标志性红色在内的6种颜色供您自由选择&#xff0c;一起自由驰骋…

微软电子密码账户严重漏洞???

微软电子密码严重漏洞&#xff1f;&#xff1f;&#xff1f; 如图有网络安全的大佬知道这是怎么回事吗&#xff1f;&#xff1f;&#xff1f;我的猜想 如图 当我登录bilibili网页的时候&#xff0c;我发现微软账号电子钱包保存的密码突然出现了许多我没有拥有的账号&#xff0…

【vue】ref 和 reactive 对比

ref&#xff1a;存储单个数据&#xff0c;如数值&#xff0c;字符串reactive&#xff1a;存储复杂数据&#xff0c;如对象&#xff0c;数组 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…