Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подскажите по синтаксису select into destinct  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
Добрый день
погуглил select into destinct - все примеры на одно поле
стоит задача перенести из одной таблицы в другую все строки выбрав уникальные по одному столбцу

например считаем уникальным первый столбец

1 2 3 3
2 2 3 4
2 2 3 5
1 2 3 6
в итоге должно перенестись

1 2 3 3
2 2 3 4

спасибо
16 май 16, 16:01    [19179569]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
MIN, MAX по остальным с группировкой по первому
16 май 16, 16:03    [19179584]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Alexander_fx,

а по какому принципу отбирается именно

1 2 3 3 а не 1 2 3 6? просто top 1?
16 май 16, 16:04    [19179588]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
TaPaK
Alexander_fx,

а по какому принципу отбирается именно

1 2 3 3 а не 1 2 3 6? просто top 1?


да устроит top 1
16 май 16, 16:45    [19179818]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Alexander_fx
TaPaK
Alexander_fx,

а по какому принципу отбирается именно

1 2 3 3 а не 1 2 3 6? просто top 1?


да устроит top 1

так пишите :) или если пофиг, то MIN/MAX вполне вариант
16 май 16, 16:47    [19179824]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Alexander_fx,

CREATE TABLE TTTT (A INT, B INT, C INT, D INT) 
GO 			  
			  
INSERT INTO TTTT VALUES(1,2,3,3 )
INSERT INTO TTTT VALUES(2,2,3,4 )
INSERT INTO TTTT VALUES(2,2,3,5 )
INSERT INTO TTTT VALUES(1,2,3,6 )

SELECT TOP 1 WITH TIES * FROM TTTT
ORDER BY ROW_NUMBER() OVER (PARTITION BY A ORDER BY B, C, D) 
16 май 16, 17:35    [19180058]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
a_voronin,

спасибо - то что нужно
16 май 16, 17:52    [19180133]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
а теперь сравни планы

declare @t TABLE (A INT, B INT, C INT, D INT) 
		  
INSERT INTO @t VALUES(1,2,3,3 )
INSERT INTO @t VALUES(2,2,3,4 )
INSERT INTO @t VALUES(2,2,3,5 )
INSERT INTO @t VALUES(1,2,3,6 )

SELECT TOP 1 WITH TIES * FROM @t T
ORDER BY ROW_NUMBER() OVER (PARTITION BY A ORDER BY B, C, D) 

--обычный group by
select T.A, MIN(T.B) as B, MIN(T.C) as C, MIN(T.D) as D from @t T
group by T.A
16 май 16, 17:57    [19180152]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Konst_One,

А теперь сравните результаты:
declare @t TABLE (A INT, B INT, C INT, D INT) 
		  
INSERT INTO @t VALUES(1,2,3,3 )
INSERT INTO @t VALUES(2,2,3,4 )
INSERT INTO @t VALUES(2,2,3,5 )
INSERT INTO @t VALUES(1,2,2,6 )

SELECT TOP 1 WITH TIES * FROM @t T
ORDER BY ROW_NUMBER() OVER (PARTITION BY A ORDER BY B, C, D) 

--обычный group by
select T.A, MIN(T.B) as B, MIN(T.C) as C, MIN(T.D) as D from @t T
group by T.A
16 май 16, 18:06    [19180187]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
invm
Konst_One,

А теперь сравните результаты:


так пофиг же какой результат
16 май 16, 18:10    [19180209]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
TaPaK
так пофиг же какой результат
Не вижу где тут
Alexander_fx
стоит задача перенести из одной таблицы в другую все строки выбрав уникальные по одному столбцу
упоминается про "пофиг".
16 май 16, 18:15    [19180237]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
invm
Konst_One,

А теперь сравните результаты:
declare @t TABLE (A INT, B INT, C INT, D INT) 
		  
INSERT INTO @t VALUES(1,2,3,3 )
INSERT INTO @t VALUES(2,2,3,4 )
INSERT INTO @t VALUES(2,2,3,5 )
INSERT INTO @t VALUES(1,2,2,6 )

SELECT TOP 1 WITH TIES * FROM @t T
ORDER BY ROW_NUMBER() OVER (PARTITION BY A ORDER BY B, C, D) 

--обычный group by
select T.A, MIN(T.B) as B, MIN(T.C) as C, MIN(T.D) as D from @t T
group by T.A


и?
мой вариант работает правильно, согласно логике ТС
16 май 16, 18:22    [19180260]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Konst_One
мой вариант работает правильно, согласно логике ТС
Правильно работает вариант от a_voronin, хоть он и не оптимален.
А ваш неверен, т.к. в "логике ТС" нигде не упоминается, что итоговая строка может содержать значения столбцов из различных исходных.
16 май 16, 18:28    [19180274]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ну ведь это очевидно
Alexander_fx
например считаем уникальным первый столбец
16 май 16, 18:29    [19180277]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Konst_One
ну ведь это очевидно
Alexander_fx
например считаем уникальным первый столбец
И что тут очевидного?
16 май 16, 19:05    [19180401]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
o-o
Guest
Konst_One,
ТС просит перенести строки, а не какие-то значения, нахватанные из разных строк.
Нельзя же сущности чужие атрибуты приписать.
Допустим, у нас опись домов граждан, в первой колонке ид гражданина, во второй число комнат, в третьей число балконов.
Надо оставить гражданину любую квартиру.
Имеем:
1, 5, 1
1, 3, 2

Ваше решение выдаст 1, 3, 1.
Но такой квартиры нет!
Есть 5 комнат и 1 балкон или 3 комнаты, но 2 балкона.
16 май 16, 20:01    [19180560]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
invm
Konst_One
мой вариант работает правильно, согласно логике ТС
Правильно работает вариант от a_voronin, хоть он и не оптимален.
А ваш неверен, т.к. в "логике ТС" нигде не упоминается, что итоговая строка может содержать значения столбцов из различных исходных.


И какой же у нас вариант оптимален?
17 май 16, 13:34    [19183569]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
a_voronin
И какой же у нас вариант оптимален?
Без top with ties
17 май 16, 13:41    [19183623]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
invm
a_voronin
И какой же у нас вариант оптимален?
Без top with ties


так напишите его
17 май 16, 13:45    [19183650]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
a_voronin,
get first row for each group все переписывать?
17 май 16, 13:50    [19183683]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
a_voronin
так напишите его
Мне-то зачем его писать?
Вы и сами вполне справитесь - по row_number() нужно фильтровать, а не сортировать.
17 май 16, 13:58    [19183730]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
invm
a_voronin
так напишите его
Мне-то зачем его писать?
Вы и сами вполне справитесь - по row_number() нужно фильтровать, а не сортировать.


а вот я утверждаю, что фильтр по ROW_NUMBER менее эффективен, чем TOP 1 WITH TIES
select TOP 1 WITH TIES * from INFORMATION_SCHEMA.COLUMNS C, INFORMATION_SCHEMA.TABLES
ORDER BY ROW_NUMBER() OVER (PARTITION BY C.TABLE_NAME ORDER BY C.COLUMN_NAME) 

SELECT * FROM 
(
	select C.*, RN = ROW_NUMBER() OVER (PARTITION BY C.TABLE_NAME ORDER BY C.COLUMN_NAME)  
	from INFORMATION_SCHEMA.COLUMNS C, INFORMATION_SCHEMA.TABLES
) A
WHERE RN = 1


Рекомендую глянуть профайлер
17 май 16, 14:16    [19183849]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
TaPaK,

Способов много. Вопрос был в том, какой самый эффективный
17 май 16, 14:17    [19183853]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1976
Кто хотел такой же быстрый код, как group by, но дающий правильный ответ, как c With ties?
Ловите:

Select A,B,C,D
From 
(
	Select Row_number() over(partition by A order by A) as E, T.*
	From @t T
) as T1	
Where T1.E=1
17 май 16, 14:18    [19183873]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по синтаксису select into destinct  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
[quot a_voronin]
invm
пропущено...

[/src]

Рекомендую глянуть профайлер


рекомендую глянуть в статистику чтения :)
17 май 16, 14:20    [19183883]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить