生成满足条件的计数器

46scxncf  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(492)

我想生成一个带条件的计数器。由 id 我想生成一个从1和1列开始的计数器 changer 从x更改为y或从y更改为x将1添加到创建的计数器。

id  changer
  1       x
  1       x
  1       y
  1       x
  1       y
  2       y
  2       x
  2       y
  3       x
  3       y
  3       x
  3       y
  3       y

预期结果是:

id  changer  counter
  1       x        1
  1       x        1
  1       y        2
  1       x        3
  1       y        4
  2       y        1
  2       x        2
  2       y        3
  3       x        1
  3       y        2
  3       x        3
  3       y        4
  3       y        4
rqmkfv5c

rqmkfv5c1#

有趣的是,如果您只需要最大值,这会使事情变得更简单,因为您只需要为发生更改的行创建一个计数器,然后获得最大值:

WITH tCountAtChange as 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_time) + 1 as aCounter 
FROM
(SELECT UniqueNbr, date_time, id
,CASE WHEN LAG(changer) OVER (PARTITION BY id ORDER BY date_time) <> changer THEN 'YES' ELSE 'NO' END as ChangeFlag
FROM MyTable) a
WHERE ChangeFlag = 'YES')

SELECT MyTable.id, COALESCE(MAX(aCounter), 1) as MaxCounter
FROM MyTable
LEFT JOIN tCountAtChange
ON MyTable.UniqueNbr = tCountAtChange.UniqueNbr
GROUP BY MyTable.id

结果:

id  MaxCounter
 1           4
 2           3
 3           4

对于order by子句,您需要一个date\U time字段或某个排序字段,以及一个uniquenbr(唯一id),您可以将其用于联接,或者您可以始终在另一个cte中使用row\U number函数创建一个。

相关问题