SQL Group By - Получить уникальный ключ каждого типа. - PullRequest
1 голос
/ 09 февраля 2012

У меня проблема с этой группировкой SQL.

Если у меня есть таблица с 3 столбцами. Ключ - это уникальный ключ для каждой записи. Тип - это тип записи, а Версия - это версия типа.

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 ]

3 голосов
/ 09 февраля 2012

Вы имеете в виду уникальный идентификатор?вам нужно использовать функцию агрегирования, например MAX, MIN, SUM, AVG

, вы не можете получить уникальное значение.Подумайте об этом, если у вас есть:

1   A   100
2   A   100
3   A   100

, вам нужна только одна строка с

A 100

, но какая логика для определенияID между 1,2 и 3?Это не уникально.Вот почему вам нужна MAX или MIN или любая другая функция агрегирования

1 голос
/ 09 февраля 2012

Это похоже на работу (если я правильно понял):

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
1 голос
/ 09 февраля 2012

Это довольно просто, просто сделайте это:

select min(ID), Type, Version
from tablename
order by ID
1 голос
/ 09 февраля 2012

Я не уверен, что именно вы ищете.Тем не менее, я предполагаю, что вы хотите один идентификатор для каждого типа и версии.Если это то, что вы хотите, используйте: 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
1 голос
/ 09 февраля 2012

как насчет того, чтобы объединить 2 столбца и затем использовать его в качестве параметра GROUP BY

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