jaideepsinh Ответов: 3

Как получить уникальное значение из нескольких записей в MSSQL


У меня есть ниже таблица [Location] в MSSQL.
Location	Value
loc1      	value1    
loc1      	value2    
loc2      	value1    
loc2      	value2    
loc3      	value2    
loc3      	value3    
loc4      	value3    
loc4      	value4    

Я хочу различное значение значения, как показано ниже o/p:
Location	Value
loc1      	value1    
loc1      	value2    
loc3      	value3    
loc4      	value4 


Что я уже пробовал:

select Location,value from Location
group by Location,value
order by location

ZurdoDev

То, что вы помещаете в раздел "Что я пробовал", даст вам запрошенный результат, так что же вы просите?

jaideepsinh

Он дает мне все записи, которые мне нужны, только отдельные значения для местоположения.

ZurdoDev

Но что это значит? Разные места? Различные значения для каждого местоположения?

Потому что sql, который у вас есть, даст вам каждое значение для каждого местоположения. Sql, который у вас есть, даст вам результат, который вы показали, что хотите.

0x01AA

То, что я читаю во всех комментариях, которые вы любите, имеет отчетливую ценность только для местоположения. Пока все идет хорошо, а теперь объясните ему логикой, что вам нравится видеть за ценность. Может быть, это min(значение) ... или что еще?

3 Ответов

Рейтинг:
23

littleGreenDude

create table #Location (
	Location varchar(10),
	Value	varchar(20)
	)


insert into #Location select 'loc1','value1'    
insert into #Location select 'loc1','value2'    
insert into #Location select 'loc2','value1'    
insert into #Location select 'loc2','value2'    
insert into #Location select 'loc3','value2'    
insert into #Location select 'loc3','value3'    
insert into #Location select 'loc4','value3'    
insert into #Location select 'loc4','value4'


select Min(Location) as Location, Value from #Location group by Value


Результаты:

Location	Value
loc1	value1
loc1	value2
loc3	value3
loc4	value4



Основываясь на приведенных ниже комментариях к дополнительным полям, включая поле ID, вот расширенный пример/решение:

create table #Location (
	ID int IDENTITY(1,1),
	Location varchar(10),
	Value	varchar(20),
	FieldA datetime 
	)


insert into #Location(Location, Value, FieldA) select 'loc1','value1',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc1','value2',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc2','value1',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc2','value2',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc3','value2',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc3','value3',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc4','value3',GETDATE()    
insert into #Location(Location, Value, FieldA) select 'loc4','value4',GETDATE()


Select ID, LocSumm.Location, LocSumm.Value, FieldA from #Location L
	inner join (
select Min(Location) as Location, Value from #Location group by Value) as LocSumm
on L.Location = LocSumm.Location and
	L.Value = LocSumm.Value
order by LocSumm.Location, LocSumm.Value


И новый результирующий набор, основанный на этом запросе:

ID	Location	Value	FieldA
1	loc1	value1	2018-09-24 09:48:45.700
2	loc1	value2	2018-09-24 09:48:45.700
6	loc3	value3	2018-09-24 09:48:45.700
8	loc4	value4	2018-09-24 09:48:45.703


jaideepsinh

Это будет работать, когда у меня есть только эти два столбца в select, но есть много других столбцов, так что это не даст мне правильного o/p.

littleGreenDude

Вы должны быть в состоянии взять предоставленный выбор и присоединиться к нему, чтобы получить желаемые результаты. Поставьте скобки вокруг этого выбора и добавьте "AS locSumm", а затем внутреннее соединение к вашему основному выбору. Что-то вроде этого:

Выберите местоположение, locSumm.Значение, местаха, перемещение, fieldC от местоположения L
внутреннее соединение (
выберите мин(место нахождения), как местоположение, Стоимость от #группы по значению
) Как locSumm
на локсуме.Местоположение = L. местоположение и
locSumm.Значение = Значение Л.
приказ по местоположению Л. Л. значение

jaideepsinh

У меня есть еще один идентификатор столбца, и когда я добавляю его в select, он не работает.
выберите мин(местоположение) расположение, стоимость,ИД отдыха, группы по значению,ИД

littleGreenDude

Я добавил расширенный пример выше, пожалуйста, дайте мне знать, если это работает для вас?

jaideepsinh

это работает, но, как я уже сказал вам, у меня есть много таблиц и столбцов, поэтому мне нужно подумать о том, чтобы продолжить работу с ROW_NUMBER().

Рейтинг:
1

OriginalGriff

Проблема двоякая, и первая из них тривиальна:

Location	Value
loc1      	value1    
loc1      	value2    
loc3      	value3    
loc4      	value4    
предположительно так и должно быть
Location	Value
loc1      	value1    
loc2      	value2    
loc3      	value3    
loc4      	value4    
Если нет, то это вообще не имеет смысла.
Тогда у вас есть вторая, более серьезная проблема.
Когда вы используете GROUP BY Location, ValueВы не говорите SQL группировать что - либо полезное-вы говорите, что значения обоих столбцов должны быть одинаковыми, чтобы быть одной группой: поэтому "loc1, value1" и "loc1, value2" находятся в отдельных группах.

Что вам нужно сделать, чтобы сгруппировать их, так это указать один столбец "местоположение" в качестве группы по, а затем использовать агрегатную функцию для выбора оставшихся данных (MIN, MAX, SUM, AVERAGE ...) Это может помочь: SQL GROUP By и ошибка "имя столбца недопустимо в списке выбора, потому что..." [^]

То, что вы хотите сделать, немного сложно, потому что совсем не очевидно, почему вы получаете желаемые результаты: учитывая, что loc1 и loc2 имеют одинаковые значения, но выбор другого значения в выходных данных чрезвычайно затрудняет точное определение того, что вы пытаетесь сделать ...


jaideepsinh

Нет, расположение не должно быть в порядке, это должно быть так, как показано ниже, если запись loc1 и loc2 не существует:
Значение Местоположения
loc3 значение1
loc3 значение2
loc4 значение3
loc4 значения4

OriginalGriff

Просто случайное размещение крошечных фрагментов данных без какого-либо объяснения того, что вы ожидаете получить или почему, никому не поможет.

jaideepsinh

Это не случайный пост. Как я уже объяснял, мне нужно первое значение последовательности с точки зрения местоположения. И это sql-таблица, так что вы можете знать, что данные не могут быть вставлены вручную, и это может быть что угодно. Я просто публикую примеры данных для людей, которые пытаются мне помочь.

Рейтинг:
0

jaideepsinh

Мне нужны только определенные значения для местоположения. так только внятно не работает.