Проблема с поиском по столбцам вниз

В SQL Server 2016 у меня есть таблица, скажем так:

ИДЕНТИФИКАТОР. Число подробности 1 02 Температура 1 03 Темп/01 2 04 Темп/04

Как мне написать сценарий обновления, чтобы использовать последние две цифры столбца сведений для обновления всех столбцов чисел, где идентификатор один и тот же? Возможно ли это вообще?

Я использовал:

Update Table
Set Number = RIGHT(details, 02)
Where number NOT LIKE CONCAT('%', details)

Но, очевидно, это не сработало, поэтому я добавил:

AND details LIKE '%/%'

Чтобы отсортировать столбцы сведений без номера в конце. Однако на самом деле это не решение, поскольку остаются столбцы с совпадающими идентификаторами, но с разными числовыми значениями.

WHERE number <> RIGHT(details, 2) AND details LIKE '%/%'может быть?
Charlieface 10.07.2024 14:44

Знаете ли вы, что поддержка SQL Server 2008 прекратилась 5 лет назад?

Charlieface 10.07.2024 14:45

В вопросе говорится where the ID is the same. Каков желаемый результат? Заменить number только для двух строк на 01? Удалить первое и изменить второе на 01? Следует ли изменить третью строку? Если ID не уникален, каков фактический первичный ключ? Это может иметь значение

Panagiotis Kanavos 10.07.2024 15:30

Вы можете использовать COUNT(*) OVER (PARTITION BY ID), чтобы узнать, сколько строк имеют одинаковый идентификатор, и обновлять только те, у которых счетчик>1.

Panagiotis Kanavos 10.07.2024 15:33

Что касается вопроса выше, желаемым результатом будет то, что первые две строки должны измениться на 01, а последняя строка останется прежней. Фактический первичный ключ в этом случае будет просто еще одним полем основного идентификатора, я не думал, что это важно для этого примера.

Paul 10.07.2024 15:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Читая между строк, кажется, что здесь можно использовать условную (оконную) агрегацию и обновляемый 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 

Другие вопросы по теме