目前仓库中有这么个需求,根据书本,科目,知识点分组,分组时按照知识点对应的章节排序,排序后只获取排名第一条的数据,因为只需要第一条,为了防止出现并列第一,这里使用hive支持的开窗函数:
row_number() over partition by
如下截图中跑出来的数据:
截图数据现象是这样,
partition by的字段值 subject_id,book_id, kp_id
和order by 的字段值unit_sort都一样,只不过是week不一样,
那么我的疑问是, 跑出来的数据是 hive默认将 week进行降序处理后,在其余字段值都一样, 按照week方式来给book_kp_unitsort_rank赋值的还是 这个book_kp_unitsort_rank赋值是随机的,
我在环境hue重跑过三四次,本以为是hue默认给排序展示给人看的,然后在hive命令行中在重跑依旧是上图结果。
写这个帖子没有结论,到现在还是不知道这个数据是 随机很巧的情况下 week=20就是排名第一还是hive的这个函数就会按照这个方式来走,
为了防止隐患(排名按照week随机给),我有更新了一把,在 order by后增加了 week desc方式;
如下:
select subject_id, book_id, unit_id, unit_sort, kp_id, week , start_date, row_number() over(partition by subject_id,book_id, kp_id order by unit_sort asc , week desc ) as book_kp_unitsort_rank from ods_common_book_unit_kp_schedule where day='2018-01-08' and subject_id in ('010', '030') and kp_id is not null and book_id = '010003001104100' and kp_id in ('1015800','1015720')
希望看到帖子的朋友们,可以给我留言发表下自己的看法,谢谢
相关推荐
- **字符串拼接**:在`PARTITION BY`子句中使用了字符串拼接操作(`||`),这使得即使在某字段值为空的情况下也能正确分组。 - **日期格式化**:通过`TO_CHAR(date, 'YYYYMMDD')`将日期字段转换为字符串形式,便于...
这个示例中,我们使用 row_number()over 函数来生成一个部门内的薪水排名列,然后在结果中取出排名在前 2 位的员工。 row_number()over 函数是一个非常有用的分析函数,可以帮助我们快速地生成各种形式的序号和排名...
第二步,我们添加row_number() over(partition by outer_code order by outer_code)来标识重复记录,这将为同一`outer_code`下的每一行分配一个唯一的行号。第三步,我们可以利用这个行号来删除重复数据,只保留每组...
下面是一个具体的示例,展示了如何创建和使用 `PARTITION BY` 和 `ROW_NUMBER()`: ```sql CREATE TABLE TESTDB(A VARCHAR(8), B VARCHAR(8)); INSERT INTO TESTDB SELECT 'A1', 'B1' UNION ALL SELECT 'A1', 'B2' ...
ROW_NUMBER() OVER 函数是 SQL Server 中的一个窗口函数,用于对查询结果进行编号。该函数可以根据指定的列进行分组和排序,并为每一组记录返回一个唯一的编号。 语法: ROW_NUMBER() OVER (PARTITION BY COLUMN ...
在SQL语言中,`ROW_NUMBER()`函数是一种非常重要的窗口函数,用于为查询结果集中的每一行分配一个唯一的整数。这个数字通常按照行的出现顺序进行分配,但也可以根据特定的排序条件进行调整。`ROW_NUMBER()`在数据...
ROW_NUMBER() OVER (PARTITION BY <column_list> ORDER BY <order_by_expression>) ``` - **PARTITION BY**:用于指定按照哪些列进行分组。 - **ORDER BY**:用于指定如何对分组内的行进行排序。 #### 三、Row_...
在SQL Server中,`ROW_NUMBER()` 是一个窗口函数,它为查询结果集中的每一行提供一个唯一的整数。这个函数通常用于实现分页或者在排序数据时为每一行分配顺序号。在Mssql中,`ROW_NUMBER()` 可以与 `OVER` 子句一起...
介绍rank() over()分析函数和 row_number() over 的使用实例及其异同点
`row_number()` 是一个内置的排名函数,而 `partition by` 是一个窗口函数的关键部分,用于在数据集上进行分组操作。这两个功能的结合使得在SQL查询中获取每个分组顶部或底部的特定行变得非常容易。 首先,让我们...
`row_number()` 是 SQL 中的一个窗口函数,常用于为查询结果中的每一行分配一个唯一且连续的整数编号。这个函数通常与 `OVER()` 子句一起使用来定义编号规则。 #### 二、row_number() 的语法结构 `row_number()` ...
ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。 以下是ROW_NUMBER()函数的语法实例: select *,row_number() over(partition by column1 ...
介绍了 row_number() over(order by column asc) 函数和 row_number() over(partition by column1 order by column2 asc) 的使用实例和方法
Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...
ROW_NUMBER() OVER ([<partition_by_clause>] <order_by_clause>) ``` - **PARTITION BY 子句**:用于指定数据集中的分区。如果省略了此子句,则整个结果集被视为一个分区。 - **ORDER BY 子句**:用于确定ROW_...
需要注意的是,`ROW_NUMBER()` 在当前`SELECT`语句中是不可见的,即不能直接在外部查询中使用`RowNumber`进行排序。此外,这种方式比传统的`TOP`和`NOT IN`方法更有效率,因为它避免了多次扫描表。 在SQL Server ...
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...
row_number() over(partition by A order by B desc)