Проблема, которую я хочу решить здесь, — это заполнение значений NULL или Empty предшествующими значениями, отличными от NULL. позвольте мне показать вам некоторые примеры данных и то, что нужно спросить, чтобы вы могли лучше понять вопрос:
Представьте, что у вас есть таблица в Excel, в которой есть столбцы ниже, и некоторые из столбцов пусты, но вы хотите заполнить их последним ненулевым значением из таблицы:
ID, ProductName, OrderDate, OrderQuantity
Такого рода данные могут встречаться на вашем пути по многим причинам, одна из причин, которую я часто видел, — это когда вы имеете дело с импортированными данными из файлов Excel или какой-либо системы хранения данных или экспортируете некоторые другие отчеты, где они не повторяются. группы и просто поместите первый для лучшей читаемости в свой документ, но вам нужно импортировать его в какую-то таблицу SQL, чтобы сгенерировать из него какие-то другие отчеты.
И теперь, когда вы импортируете это в SQL Server, у вас будут NULL для пустых ProductNames, теперь вы хотите обновить столбец ProductName со значением Non-NULL раньше.
Есть много способов сделать это, первый и худший (с точки зрения производительности, особенно когда вы имеете дело с огромным объемом данных, что очень возможно, поскольку вы импортировали данные из отчета хранилища данных) - это простой курсор, чтобы просто заказать ID проходит по списку и обновляет NULL один за другим, пока не дойдет до следующего None-NULL и так далее, и вы знаете, как это сделать, но это не то, как разработчики SQL любят выполнять свою работу!
второй способ, который я испытал, - это использование CTE
Есть много других способов решить эту проблему, например, использование объединения CROSS APPLY или Dense_Rank и многих других интересных способов, но сегодня я думаю, что этот, который вы увидите, — лучший способ сделать это.
После введения новых функций функций Windows в SQL Server 2012 я думаю, что это способ решить эту проблему с помощью функции Magic of the First_Value в функциях Windows SQL Server 2012 следующим образом: