1
select 
   candidateId,feedback_request_id,key_skill_id, 
   ROW_NUMBER() OVER (PARTITION BY key_skill_id 
                      ORDER BY feedback_request_id,key_skill_id) sequence 
from newFeedbackReport  
where candidateId= 2501 
GROUP by feedback_request_id, key_skill_id 
order by  feedback_request_id,key_skill_id ;

我尝试编写类似以下内容,但结果不一样:

select
   candidateId,
   feedback_request_id,
   @key_skill_id := key_skill_id as key_skill_id,
   @row_number :=
      CASE
         WHEN  @key_skill_id = key_skill_id THEN @row_number+1
         ELSE 1
      END AS row_number
from newFeedbackReport,
(SELECT @row_number := 0, @key_skill_id := '') as t
where candidateid = 2501  
GROUP by feedback_request_id, key_skill_id
order by feedback_request_id, key_skill_id;
4

1 回答 1

0

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

但是,要对行进行初始编号,必须先对表进行排序,key_skill_id然后再对表进行排序feedback_request_id。原始 SQL中的子句的目的GROUP BY是充当SELECT DISTINCT查询的等效项,不能使用它,因为添加的行号列保证了每一行都是不同的。工作的原因GROUP BY是它在执行窗口函数之前应用,而隐含过滤将在执行函数之后应用。ROW_NUMBERSELECT DISTINCTROW_NUMBER

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

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;
于 2022-02-07T19:17:23.273 回答