识别Group By中的组

时间:2013-12-02 17:19:17

标签: mysql sql group-by grouping

我正在按照声明运行一个复杂的组,我将所有结果都记录在各自的组中。但我想创建一个带有“组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,索引相关联,无论它将被调用。

我将如何做到这一点?

4 个答案:

答案 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;

sqlfiddle demo

这会为每个描述分配不同的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

SQL Fiddle

答案 3 :(得分:0)

SELECT partID , Description, @s:=@s+1 GroupID 
FROM part, (SELECT @s:= 0) AS s
GROUP BY Description