В SQL Server 2016 у меня есть таблица, скажем так:
Как мне написать сценарий обновления, чтобы использовать последние две цифры столбца сведений для обновления всех столбцов чисел, где идентификатор один и тот же? Возможно ли это вообще?
Я использовал:
Update Table
Set Number = RIGHT(details, 02)
Where number NOT LIKE CONCAT('%', details)
Но, очевидно, это не сработало, поэтому я добавил:
AND details LIKE '%/%'
Чтобы отсортировать столбцы сведений без номера в конце. Однако на самом деле это не решение, поскольку остаются столбцы с совпадающими идентификаторами, но с разными числовыми значениями.
Знаете ли вы, что поддержка SQL Server 2008 прекратилась 5 лет назад?
В вопросе говорится where the ID is the same
. Каков желаемый результат? Заменить number
только для двух строк на 01
? Удалить первое и изменить второе на 01
? Следует ли изменить третью строку? Если ID
не уникален, каков фактический первичный ключ? Это может иметь значение
Вы можете использовать COUNT(*) OVER (PARTITION BY ID)
, чтобы узнать, сколько строк имеют одинаковый идентификатор, и обновлять только те, у которых счетчик>1.
Что касается вопроса выше, желаемым результатом будет то, что первые две строки должны измениться на 01, а последняя строка останется прежней. Фактический первичный ключ в этом случае будет просто еще одним полем основного идентификатора, я не думал, что это важно для этого примера.
Читая между строк, кажется, что здесь можно использовать условную (оконную) агрегацию и обновляемый CTE:
USE Sandbox;
GO
SELECT *
INTO dbo.YourTable
FROM (VALUES(1,'02','Temp'),
(1,'03','Temp/01'),
(2,'04','Temp/04'))V([ID.],Number,Details) --ID. is a poor choice for a column name; "." characters should not be in names
GO
WITH CTE AS(
SELECT [ID.],
Number,
Details,
MAX(CASE WHEN Details LIKE '%/[0-9][0-9]' THEN RIGHT(Details,2) END) OVER (PARTITION BY [ID.]) AS Suffix
FROM dbo.YourTable)
UPDATE CTE
SET Number = Suffix;
GO
SELECT *
FROM dbo.YourTable;
GO
DROP TABLE dbo.YourTable;
Использовать это...
WITH cte_table AS (
SELECT Details,CAST(NULL AS NVARCHAR(MAX)) AS default_null_or_number,
Details AS details_minus_counting, 1 AS charactor_Counting -- for starting search by First Charactor
FROM User_Table
UNION ALL
SELECT Details,
CASE WHEN Substring(details_minus_counting, 1, 1) LIKE '[0-9]' --FEACH NUMBER
THEN isnull(default_null_or_number, '') + Substring(details_minus_counting, 1, 1)
ELSE default_null_or_number END,
Substring(details_minus_counting, 2, len(details_minus_counting) - 1),
charactor_Counting + 1 --> Loop
FROM cte_table WHERE len(details_minus_counting) > 0 -->Finish when Char Counting 0.
)
SELECT a.Details, a.default_null_or_number from cte_table a inner join
(
SELECT Details,max(len(default_null_or_number)) final_numeric_value
FROM cte_table where default_null_or_number is not null group by Details
) b on a.details=b.Details and len(a.default_null_or_number)=b.final_numeric_value
WHERE number <> RIGHT(details, 2) AND details LIKE '%/%'
может быть?