如何在Qlik表格与Qlik Sense中编写含Partition By的Row_Number函数?
在Qlik Sense中实现带Partition By的Row_Number逻辑
Qlik Sense脚本没有直接支持SQL风格的OVER (PARTITION BY)语法,需要通过排序+条件判断来实现你要的行号逻辑,以下是具体实现方案:
脚本端实现(推荐,性能更优)
对应你给出的SQL逻辑,在加载脚本中按以下步骤操作:
- 先按分区字段(
jobnumber)和排序字段(转换后的日期EventDate)对数据排序 - 使用
Peek()函数对比上一行的分区字段值,判断是否需要重置行号
示例代码:
// 加载关联后的job和hist数据,生成row_id LOAD job.jobnumber, Date(hist.EventTimeStamp) as EventDate, // 对应SQL的cast(hist.EventTimeStamp as Date) // 其他需要保留的字段(比如hist表的其他字段、job表的其他字段) // 生成row_id:同一jobnumber内按日期递增编号,不同jobnumber重置为1 If(Peek(jobnumber) = jobnumber, Peek(row_id) + 1, 1) as row_id FROM [你的数据源路径/数据库连接] // 替换为实际数据源,比如已关联的QVD或数据库表 ORDER BY jobnumber, EventDate ASC; // 必须按分区字段+排序字段排序,保证逻辑生效
代码说明
ORDER BY jobnumber, EventDate ASC:核心前提,确保同一jobnumber的记录按日期顺序排列,这样分区内的行号能正确递增Peek(jobnumber):获取上一行的jobnumber值,和当前行对比,判断是否处于同一分区Peek(row_id) + 1:如果在同一分区,行号在上一行基础上加1;否则重置为1
前端表达式实现(适用于临时计算)
如果需要在前端表格/图表中直接计算行号,可以用Aggr()函数结合RowNo()实现:
Aggr( RowNo(), jobnumber, // 分区字段 Date(EventTimeStamp) // 排序字段 )
注意:前端计算适合数据量较小的场景,数据量大时建议优先用脚本生成行号,避免性能问题
内容的提问来源于stack exchange,提问作者neha ingley
相关产品推荐
相关产品推荐

