如何编号sql中的重复行

时间:2014-10-28 03:33:03

标签: mysql sql database greatest-n-per-group row-number

我正在尝试找出相应编号重复行的最佳/最简单的方法。我有一组数据,我上传到数据库表。我上传了它,并自动递增它,现在我想以我的问题中显示的方式生成order_id。例如

    ----ID-------NAME-----------ORDER_ID----------
        1        Bob Smith        1
        2        Steve Jones      2
        3        Bob Smith        1
        4        Billy Guy        3
        5        Steve Jones      2
    ----------------------------------------------

我原以为我可以使用select NAME from table where name= duplicate_name这样的陈述,但我似乎无法弄清楚我是如何真实地去做的,更不用说之后输入适当的ORDER_ID了。有一个简单的方法吗?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT 
  A.ID, 
  A.NAME, 
  (SELECT TOP 1 T.ID 
    FROM table AS T 
    WHERE T.NAME = A.NAME 
    ORDER BY T.ID) AS ORDER_ID 

  FROM table AS A

如果您的数据库引擎不支持TOP关键字,但支持LIMIT关键字,您可以这样做:

SELECT 
      A.ID, 
      A.NAME, 
      (SELECT T.ID 
        FROM table AS T 
        WHERE T.NAME = A.NAME 
        ORDER BY T.ID
        LIMIT 1) AS ORDER_ID 

      FROM table AS A

答案 1 :(得分:0)

SELECT t.*, t1.order_id
FROM  (
   SELECT name, @rownum := @rownum + 1 AS order_id
   FROM  (
      SELECT name, min(id) AS min_id
      FROM   tbl
      GROUP  BY name
      ) t0
   ,  (SELECT @rownum := 0) r
   ORDER  BY min_id
   ) t1
JOIN tbl t USING (name);
  1. 在子查询t0中聚合所有名称并计算每个名称的最小id。根据{{​​1}},您似乎想要在首次出现后为姓名编号。这与仅仅添加id一样略有不同,就像我评论的那样。

  2. Simulating the basic window function row_number(),根据dense_rank()中的此顺序为每个名称标记一个正在运行的号码。

  3. 加入回到基表。