在列中的每个副本上递增计数器

时间:2014-04-07 12:09:56

标签: mysql sql duplicates

我有一张桌子:

id | value
1  | -
1  | a
2  | b
1  | c
3  | d
2  | e

然后我需要一个计数器列,它从1列开始,用于id列中的每个不同值

所需的选择结果:

id | value | counter
1  | -     | 1
1  | a     | 2
2  | b     | 1
1  | c     | 3
3  | d     | 1
2  | e     | 2

我发现的只是计算重复数量等,但不是针对特定列的每个副本上的递增计数器......?

4 个答案:

答案 0 :(得分:6)

如果您不关心排序,只关注相应的行号,请使用如下变量:

SELECT 
  t.*, 
  @i:=IF(id=@id, @i+1, 1) AS num, 
  @id:=id 
FROM 
  t 
  CROSS JOIN (SELECT @i:=0, @id:=0) AS init 
ORDER BY id

答案 1 :(得分:1)

您要完成的任务称为 RANKING 。不幸的是,MySQL没有像SQL Server ROW_NUMBER()DENSE_RANK()等那样的排名函数。

您可以尝试以下查询MySQL

SELECT t.ID, t.Value, count(*) as Counter 
FROM tableName t
JOIN tableName b ON t.ID = b.ID AND t.Value >= b.Value
GROUP BY t.ID, t.Value

SQL Fiddle DEMO

答案 2 :(得分:0)

select  t.id1,  t.value,
row_number()  over (partition by t.id1 order by t.value ) counter
from test t;

我希望这会有用:)

答案 3 :(得分:0)

这将为您完成工作:

SELECT [id]
      ,[value]
      ,ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY value) AS 'counter'
  FROM [TableName]

ROW_NUMBER将添加编号。 PARTITION BY子句允许我们在调用ROW_NUMBER()时对结果进行分组,而不通过GROUP BY对它们进行分组。它只是告诉ROW_NUMBERR在计算时要使用哪些分组。

对于MySql,您可以使用这些链接:

http://blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/

http://www.folkstalk.com/2013/03/grouped-row-number-function-mysql.html

在你的情况下:

SET @row_number:=0;
SET @id:='';
SELECT @row_number:=CASE WHEN @id=id THEN @row_number+1 ELSE 1 END AS row_number , @id:=id AS id, value
FROM TableName
ORDER BY id;