我的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
获取所有独特的类型和版本,但我无法弄清楚如何完成查询。
答案 0 :(得分:3)
你的意思是唯一的身份证?
你需要使用像MAX, MIN, SUM, AVG
你无法获得独特的价值。想一想,如果你有:
1 A 100
2 A 100
3 A 100
你只需要一行
A 100
但是在1,2和3之间定义ID的逻辑是什么?它不是唯一的。这就是您需要MAX
或MIN
或任何其他聚合函数
答案 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