在不使用带有PARTITION和multiple group-by的MYSQL ROW_NUMBER函数重置行计数的情况


select 
Id,request_id,key_skill_id, 
ROW_NUMBER() OVER (PARTITION BY skill_id 
ORDER BY request_id,skill_id) sequence 
from report  
where id= x 
GROUP by request_id, skill_id 
order by  request_id,skill_id ;

我试着写下面这样的东西,但结果不一样:

选择id,request_ id,@skill_ id:=skill_,@行编号(_N(:=案例当@skill_id=skill_id时,@row_number+1其他1结束为行号根据报告,(选择@row_number:=0,@skill_id:=''(为t其中id=x
按request_id、skill_id分组按request_id、skill_id排序;

最初的窗口函数让我觉得有点奇怪,但我承认我自己并不经常使用这些函数,因为这些函数仅限于MySQL 5.7。PARTITION BY子句指定key_skill_id列,因此将对具有相同key_skill_id列值的行重新编号1、2、3等。但是,在SQL的最后有一个ORDER子句,它对结果进行重新排序,以便具有相同key_skill_id的行通常不会在一起(例如,除非只选择了feedback_request_id的一个值(。

然而,要对行进行初始编号,表必须首先按key_skill_id排序,然后按feedback_request_id排序。原始SQL中的GROUP BY子句的作用相当于SELECT DISTINCT查询,因为添加的行号列保证了每一行都是不同的,所以不能使用它。GROUP BY工作的原因是在执行ROW_NUMBER窗口函数之前应用它,而在执行ROW_NUMBER函数之后将应用SELECT DISTINCT隐含滤波。

鉴于您没有提供表定义、数据、预期输出等,我无法测试以下内容。这是我最好的猜测:

select
x.*,
@row_number :=
CASE
WHEN  @key_skill_id = x.key_skill_id THEN @row_number+1
ELSE 1
END AS sequence,
@key_skill_id = x.key_skill_id
from (
select distinct /* to emulate group by */
candidateId,
feedback_id,
key_skill_id
from newFeedbackReport
where candidate_id = 2501
order by key_skill_id, feedback_request /* this is not a mistake */
) x,
(SELECT @row_number := 0, @key_skill_id := '') as t
order by feedback_request_id, key_skill_id;

相关内容

最新更新