我正在按照声明运行一个复杂的组,我将所有结果都记录在各自的组中。但我想创建一个带有“组ID”的自定义列。基本上所有组合在一起的项目都会共享一个ID。
这就是我得到的:
partID | Description
-------+---------+--
11000 | "Oven"
12000 | "Oven"
13000 | "Stove"
13020 | "Stove"
12012 | "Grill"
这就是我想要的:
partID | Description | GroupID
-------+-------------+----------
11000 | "Oven" | 1
12000 | "Oven" | 1
13000 | "Stove" | 2
13020 | "Stove" | 2
12012 | "Grill" | 3
“GroupID”不作为任何表中的数据存在,它将是一个自定义生成的列(别名),它将与该组的键,id,索引相关联,无论它将被调用。
我将如何做到这一点?
答案 0 :(得分:1)
我认为这是返回五行的查询:
select partId, Description
from part p;
以下是一种方法(使用标准SQL)来获取组:
select partId, Description,
(select count(distinct Description)
from part p2
where p2.Description <= p.Description
) as GroupId
from part p;
这是使用相关子查询。子查询查找的所有描述值都小于当前值 - 并计算不同的值。请注意,这给出了与OP中的值不同的一组值。这些将按字母顺序分配,而不是在数据中首次遇到时分配。如果这很重要,那么OP应该将其添加到问题中。基于这个问题,特定的顺序似乎并不重要。
答案 1 :(得分:1)
这是获得它的一种方法:
SELECT p.partID,p.Description,b.groupID
FROM (
SELECT Description,@rn := @rn + 1 AS groupID
FROM (
SELECT distinct description
FROM part,(SELECT @rn:= 0) c
) a
) b
INNER JOIN part p ON p.description = b.description;
这会为每个描述分配不同的groupID,然后按照该描述加入原始表。
答案 2 :(得分:1)
根据您对Gordon回答的评论,我认为您需要的是一个派生表来生成您的groupid,如下所示:
select
t1.description,
@cntr := @cntr + 1 as GroupID
FROM
(select distinct table1.description from table1) t1
cross join
(select @cntr:=0) t2
会给你:
DESCRIPTION GROUPID
Oven 1
Stove 2
Grill 3
然后您可以在原始查询中使用它,加入描述:
select
t1.partid,
t1.description,
t2.GroupID
from
table1 t1
inner join
(
select
t1.description,
@cntr := @cntr + 1 as GroupID
FROM
(select distinct table1.description from table1) t1
cross join
(select @cntr:=0) t2
) t2
on t1.description = t2.description
答案 3 :(得分:0)
SELECT partID , Description, @s:=@s+1 GroupID
FROM part, (SELECT @s:= 0) AS s
GROUP BY Description