我正在尝试找出相应编号重复行的最佳/最简单的方法。我有一组数据,我上传到数据库表。我上传了它,并自动递增它,现在我想以我的问题中显示的方式生成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
了。有一个简单的方法吗?
答案 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);
在子查询t0
中聚合所有名称并计算每个名称的最小id
。根据{{1}},您似乎想要在首次出现后为姓名编号。这与仅仅添加id
一样略有不同,就像我评论的那样。
Simulating the basic window function row_number()
,根据dense_rank()
中的此顺序为每个名称标记一个正在运行的号码。
加入回到基表。