Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SELECT DISTINCT Row_Number()OVER(ORDER BY ...)
И всё понятие об оконных функциях летит к чертям.

К сведению: DISTINCT, срабатывает "после" Row_Number()OVER()
9 дек 11, 19:03    [11739224]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
я что-то никак не могу представить себе задачу, в которой такое понадобилось
9 дек 11, 19:17    [11739272]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
А что не так-то? Для тех кто в танке, разъясните плз, где диссонас?
declare @t table (a int)
insert @t select 1 union all select 1 union all select 2 union all select 2
select * from @t
SELECT DISTINCT Row_Number()OVER(ORDER BY (select 1)) from @t
SELECT Row_Number()OVER(ORDER BY (select 1)) from @t
9 дек 11, 19:53    [11739416]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dense_rank
Guest
Mnior
SELECT DISTINCT Row_Number()OVER(ORDER BY ...)
И всё понятие об оконных функциях летит к чертям.

К сведению: DISTINCT, срабатывает "после" Row_Number()OVER()

и в чем проблема?
по мне так, так все и должно быть...
вы добавили вычисляемую колонку (row_number) и делаете distinct уже по набору данных с этой колонкой.

опять же ни кто не мешает вам использовать dense_rank


; with t as (
	select 1 as f1, 2 as f2
	union all
	select 1 as f1, 2 as f2
	union all
	select 2 as f1, 3 as f2
	union all
	select 2 as f1, 3 as f2
) 
select 
	distinct *, row_number() over (partition by f1 order by f2)
from T



; with t as (
	select 1 as f1, 2 as f2
	union all
	select 1 as f1, 2 as f2
	union all
	select 2 as f1, 3 as f2
	union all
	select 2 as f1, 3 as f2
) 
select 
	distinct *, dense_rank() over (partition by f1 order by f2)
from T
9 дек 11, 19:54    [11739426]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
1. Можно обойти GROUP BY-ем.
2. А возникла при решении одной реальной задачи (убогая структура системы, да и сами данные, временное решение). Реально.
3. Дело не в этом, а в самом существовании такой консрукции. Факт? Факт!

Ваше утверждение можно свести к:
А кому этот DISTINCT сдался?!
Вы правы. Вредный сахар.
9 дек 11, 20:00    [11739456]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior,

Не, давайте не путать
Логический порядок обработки инструкции SELECT:
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE или WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP


Все-так то что дистинкт и груп бай могут быть обработаны в некоторых ситуациях теми же самыми операциями в плане, или привести к одному и тому же результату - не значит что они эквивалентны, так что я тут диссонанса не вижу, имхо, все ок!
А как уж обойти, вопрос другой, можно и вложенным подзапросом...
9 дек 11, 20:06    [11739480]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Для тех кто "в танке". Всё дело в определении и цели оконных функций.
Оконые функции не должные менять результирующий набор априори, а только добавлять данные (колонку).
В данном случае оно нарушается.
Row_Number
То что так оно работает, никто не спорит. Просто теперь называем чёрное белым.
Это когда делали систему по одному, а получилось ... немного не так.
DISTINCT появился раньше чем оконные, менять что либо тут не будут. Нужно просто смиристься.

А в добавок очень важное, это долбаный DISTINCT является камнем предкновения оптимизации запросов для этих функций.
Сколько же было соплей по этому поводу на форуме!
9 дек 11, 20:20    [11739532]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior
Для тех кто "в танке". Всё дело в определении и цели оконных функций.
Оконые функции не должные менять результирующий набор априори, а только добавлять данные (колонку).
В данном случае оно нарушается.
Row_Number
То что так оно работает, никто не спорит. Просто теперь называем чёрное белым.
Это когда делали систему по одному, а получилось ... немного не так.
DISTINCT появился раньше чем оконные, менять что либо тут не будут. Нужно просто смиристься.

А в добавок очень важное, это долбаный DISTINCT является камнем предкновения оптимизации запросов для этих функций.
Сколько же было соплей по этому поводу на форуме!

Все дело только в том, как обрабатываются оконные функции. Оконные функции разрешены только в select (ну или order by, что тоже м.б. вычислено во время select). Цели их использования у каждого свои и могут быть зело разнообразны. Что такое "результирующий набор" в вашем понимании я не разумею, но для меня, результирующий набор, над которым выполняются оконные функции, это тот набор который получился до стадии выполнения всех предыдущих операторов в логическом порядке, определенном в соответствии с документацией (см. пост выше).

Касательно раньше-позже, cte появились позже всех основных конструкций языка, и майкрософт не стесняется объявлять то что теперь все инструкции должны заканчиваться ";", чтобы их анализатор мог распознать, где какое with. То же самое касается многих фич объявляемых с каждой версией как depricated. Так что - если надо, изменят все что хочешь. Просто тут, особо нечего менять, ибо все логично.

Насчет оптимизации и использования дистинкт, как говорится: "с дуру можно лошадь обесчестить".
9 дек 11, 21:36    [11739853]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SomewhereSomehow
Что такое "результирующий набор" в вашем понимании я не разумею, но для меня, результирующий набор, над которым выполняются оконные функции, это тот набор который получился до стадии выполнения всех предыдущих операторов в логическом порядке, определенном в соответствии с документацией (см. пост выше).
Мы немного не о том говорим.
Есть понятия общественные (теория реляционных данных, общие подходы в SQL) и частные (документашка M$, Mnior, SomewhereSomehow).
То что в доке написан порядок обработки, это очевидно, и это ... не интересно, и не имеет отношения к теории SQL. Другое дело когда написано выражение "результирующий набор" в доке по Row_Number(). Что M$ подразумевает под этим выражением? Общепринятое понятие или свою вселенную понятий? А какой практический смысл "своей вселенной", обособленности?
Результирующий набор не может быть промежуточным понятием по определению.

Вот представьте (параллельная вселенная) что всё ровно наоборот. Окошки работают после DISTINCT. И тут врывается roinM и начитает вопить, что это не по феншую. Неужели wohemoSerehwemoS также "поставил беднягу на место" словами "By Design"?
Осталось только "стравить" SomewhereSomehow с wohemoSerehwemoS в неравной схватке. :)

А разница у той вселенной какая? Правильно, окошки никак не влияют на количество строк, а DISTINCT влияет. Ровно по общепринятому определению, и ровно наоборот нашему случаю.

Насчёт камня преткновения я немного переборщил, так, камушек. Но камушек за камушком ...

distinct ROW_NUMBER() - ну ничего удивительного, лишь бы ответить. Никакого диалога ... со смертными.
К слову о компаниях: Чем больше зверь, тем меньше у него яйца.
10 дек 11, 22:29    [11743197]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior
Что M$ подразумевает под этим выражением? Общепринятое понятие или свою вселенную понятий? А какой практический смысл "своей вселенной", обособленности?

Свою, разумеется.
Практический смысл в том, что либо мы имеем некую идеальную вселенную в вакууме, либо какую-то приближенную модель с неточностями.
10 дек 11, 23:19    [11743382]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
locky
Практический смысл в том ...
В том то и дело. В текущем варианте мы имеем совершенно бесполезного коня (ставить DISTINCT бесполезно / невозможно воспользоваться сахарком).
Ани же написали в правилах для DISTINCT что NULL = NULL. Так что, тяжело было дописать туды окошки? Типа реализовать очень сложно? Есть нюансы? Что-то не вижу не одного.
DISTINCT сровнять с GROUP BY делов-то.
11 дек 11, 01:26    [11743800]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior
locky
Практический смысл в том ...
В том то и дело. В текущем варианте мы имеем совершенно бесполезного коня (ставить DISTINCT бесполезно / невозможно воспользоваться сахарком).
Ани же написали в правилах для DISTINCT что NULL = NULL. Так что, тяжело было дописать туды окошки? Типа реализовать очень сложно? Есть нюансы? Что-то не вижу не одного.
DISTINCT сровнять с GROUP BY делов-то.

В документации четко описан порядок обработки
Из той же документации легко почерпнуть как вы можете добиться желаемого результата.
Что не так?
11 дек 11, 01:27    [11743806]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
- Доктор, меня игнорируют.
- Следующий.

locky, всё нормально.
11 дек 11, 08:33    [11744160]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
Паганель,

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

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

обрабатвается это все вот так (причем даже это иногда не спасает):

DECLARE @getPriceIdentity TABLE
									(
										identityId INT,
										materialId INT,
										materialCode INT,
										price DECIMAL( 18, 2 ),
										bDate DATETIME,
										PRIMARY KEY CLUSTERED
																(
																	identityId,
																	materialId,
																	bDate
																)
															
									)




	INSERT INTO @getPriceIdentity
	SELECT DISTINCT
			ROW_NUMBER() OVER
								(	
									ORDER BY 
												distinct_bDate.materialId,
												distinct_bDate.bDate
									ASC
								) AS
			identityId,		
			distinct_bDate.materialId,
			distinct_bDate.materialCode,
			distinct_bDate.price,
			distinct_bDate.bDate
		FROM
			(
				SELECT DISTINCT
						materialId,
						materialCode,
						price,
						bDate
					FROM 
						INSERTED 
			) AS distinct_bDate; 

	INSERT INTO md.MaterialsPricesNBPL 
										(
											materialId,
											materialCode,
											price,
											bDate,
											eDate
										)
	SELECT 
			t1.materialId,
			t1.materialCode,
			t1.price,
			t1.bDate,
			ISNULL( ( t2.bDate - 1 ), CAST( '12.31.9999'  AS DATETIME ) ) AS eDate 
		FROM 
			@getPriceIdentity AS t1
	LEFT OUTER JOIN
			@getPriceIdentity AS t2
		ON 
			t1.identityId = t2.identityId - 1 AND
			t1.materialId = t2.materialId;


уверен, что существуют реальные задачи и для того, что описал Mnior.
11 дек 11, 16:34    [11744806]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
dmitry stakanov
обрабатвается это все вот так
И зачем Вы здесь написали DISTINCT перед ROW_NUMBER ?
11 дек 11, 16:52    [11744872]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
Паганель, в надежде убрать дубликаты.
теперь я знаю, что он там не нужен.
11 дек 11, 17:31    [11744986]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
goto'n'break
Guest
dmitry stakanov
такой эскуэль

офф
1) каким словом называешь своё стиль форматирования кода? (напр.: нигга браза sql, mc sql, коде хаус, джангл транзангл)
2) не доводилось ли слышать какими словами описывают автора подобным образом оформленного кода?
11 дек 11, 19:57    [11745463]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
goto'n'break, прировняй таб к пробелу и всё станет понятней.
M$ в этом деле неплохо троллит любителей табов - меняет размер по дефолту при каждой новой версией.
Всю жизнь работать на не моноширных шрифтах, тому кто это у них там делает.
11 дек 11, 20:30    [11745592]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
goto'n'break
Guest
Mnior,

да хоть так, хоть эдак. изврат он и есть изврат.
и переключение на tabs as spaces по идее рефлексом должно быть.
11 дек 11, 22:33    [11746026]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
Mnior, дело вот в чем: когда накатываешь новую версию апдейт накатывается в одном тране и обертке N''. съехавшие табы отчасти, как мне кажется, из-за того, что я выравниваю код по оператору выполнения:

EXECUTE @tSQL = N'
SELECT
col1
FROM
tab1;';

при обновлении или создании процедур сервер запоминает кол-во пробелов и табов, которые были в обертке.

в самом коде это выглядит отвратительно, но читабельностью кода в базе приходится жертвовать в угоду читабельности при накате версии.
11 дек 11, 22:41    [11746056]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
goto'n'break, это как?
11 дек 11, 22:44    [11746068]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
goto'n'break, ))) а вы смешной пиcатель. но немного впереди паравоза бежите.
11 дек 11, 22:48    [11746078]     Ответить | Цитировать Сообщить модератору
 Re: DISTINCT+ Row_Number -> такая оконность  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
dmitry stakanov
Mnior, дело вот в чем: когда накатываешь новую версию апдейт накатывается в одном тране и обертке N''. съехавшие табы отчасти, как мне кажется, из-за того, что я выравниваю код по оператору выполнения:

EXECUTE @tSQL = N'
SELECT
col1
FROM
tab1;';

при обновлении или создании процедур сервер запоминает кол-во пробелов и табов, которые были в обертке.

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


пробелы съелись текст процессором) select - col1 - там должно быть 2 таба.
11 дек 11, 22:51    [11746089]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить