SQL Group By - 获取每种类型的唯一键

时间:2012-02-09 17:10:06

标签: sql sql-server-2008 tsql group-by

我的SQL分组存在问题。

如果我有一个包含3列的表格。密钥是每条记录的唯一密钥。 Type是记录的类型,Version是该类型的版本。

ID    Type      Version
------------------------
1      A          200
2      A          100
3      B          200
4      B          200
5      B          100

我需要为每种类型的每个版本获得1行

所以它看起来像

ID    Type       Version
------------------------
1      A           200
2      A           100
3      B           200
5      B           100

我知道我需要按类型和版本进行分组,但我似乎无法弄清楚如何为每个类型和版本获取唯一键,因为它们位于同一个表中

SELECT Type, Version FROM TableName GROUP BY Type, Version 

获取所有独特的类型和版本,但我无法弄清楚如何完成查询。

5 个答案:

答案 0 :(得分:3)

你的意思是唯一的身份证? 你需要使用像MAX, MIN, SUM, AVG

这样的聚合函数

你无法获得独特的价值。想一想,如果你有:

1   A   100
2   A   100
3   A   100

你只需要一行

  

A 100

但是在1,2和3之间定义ID的逻辑是什么?它不是唯一的。这就是您需要MAXMIN或任何其他聚合函数

的原因

答案 1 :(得分:1)

如何连接2列,然后将其用作GROUP BY参数

SELECT ID, Type, Version, (Type + Version) FROM TableName GROUP BY (Type + Version)

答案 2 :(得分:1)

我不确定你到底在找什么。 但是,我假设您需要为每个类型和版本提供一个ID。 如果这是您想要使用的:选择列表中的min(id)或max(id),并且不要通过

向组添加任何内容
select min(id) as min_id, type, version from tablename group by type,version

select max(id) as max_id, type, version from tablename group by type,version

答案 3 :(得分:1)

这很简单,只需这样做:

select min(ID), Type, Version
from tablename
order by ID

答案 4 :(得分:1)

这似乎有效(如果我理解正确的话):

declare @table table (ID int, theType varchar(5), theVersion varchar(5))

INSERT INTO @table (ID, theType, theVersion)
VALUES 
(1, 'A', '200'),
(2, 'A', '100'),
(3, 'B', '200'),
(4, 'B', '200'),
(5, 'B', '100')

SELECT a1.ID, a1.theType, a1.theVersion
FROM @table a1
LEFT JOIN @table a2 ON a2.theType = a1.theType AND a2.theVersion = a1.theVersion AND a2.ID < a1.ID
WHERE a2.ID IS NULL