В выберите сценарий с выходом образца NULL:
SELECT DISTINCT a.diff_date1
,CASE WHEN b.Equal IS NOT NULL THEN Equal
WHEN c.Greater IS NOT NULL THEN c.Greater
ELSE d.Less END as variance_id_date1_Up
FROM [mASter].[dbo].[tableName2] AS a LEFT OUTER JOIN
(SELECT [diff_date1]
,CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'+',''),' ','')) = 1 AND CAST([diff_date1] AS int) = CAST(REPLACE(REPLACE(b.name ,'+',''),' ','') AS int) then b.id
ELSE NULL END AS [Equal]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b) AS b
on a.diff_date1 =b.diff_date1 AND b.Equal IS NOT NULL
LEFT OUTER JOIN
(SELECT [diff_date1]
,Max(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','')) = 1 AND CAST([diff_date1] AS int) > REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','') then b.id ELSE NULL END AS int)) AS [Greater]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS c
on a.diff_date1 = c.diff_date1 AND c.Greater IS NOT NULL AND b.diff_date1 IS NULL
LEFT OUTER JOIN
(SELECT [diff_date1]
,Min(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'<',''),' ','')) = 1 AND CAST([diff_date1] AS int) < CAST(REPLACE(REPLACE(b.name ,'<',''),' ','') AS int) then b.id ELSE NULL END AS int))AS [Less]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS d
on a.diff_date1 =d.diff_date1 AND b.diff_date1 IS NULL AND c.diff_date1 IS NULL
Пример вывода:
diff_date1 variance_id_date1
0 7
-21 1
4 9
5 10
58 10
Обновление сценария:
Update [tableName2] set variance_id_date1 = variance_id_date1_Up from(
SELECT DISTINCT a.diff_date1
,CASE WHEN b.Equal IS NOT NULL THEN Equal
WHEN c.Greater IS NOT NULL THEN c.Greater
ELSE d.Less END as variance_id_date1_Up
FROM [mASter].[dbo].[tableName2] AS a LEFT OUTER JOIN
(SELECT [diff_date1]
,CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'+',''),' ','')) = 1 AND CAST([diff_date1] AS int) = CAST(REPLACE(REPLACE(b.name ,'+',''),' ','') AS int) then b.id
ELSE NULL END AS [Equal]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b) AS b
on a.diff_date1 =b.diff_date1 AND b.Equal IS NOT NULL
LEFT OUTER JOIN
(SELECT [diff_date1]
,Max(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','')) = 1 AND CAST([diff_date1] AS int) > REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','') then b.id ELSE NULL END AS int)) AS [Greater]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS c
on a.diff_date1 = c.diff_date1 AND c.Greater IS NOT NULL AND b.diff_date1 IS NULL
LEFT OUTER JOIN
(SELECT [diff_date1]
,Min(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'<',''),' ','')) = 1 AND CAST([diff_date1] AS int) < CAST(REPLACE(REPLACE(b.name ,'<',''),' ','') AS int) then b.id ELSE NULL END AS int))AS [Less]
FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS d
on a.diff_date1 =d.diff_date1 AND b.diff_date1 IS NULL AND c.diff_date1 IS NULL) AS INPUT
where [tableName2].diff_date1 = INPUT.diff_date1
Не забудьте изменить имя таблицы или столбцы имя.
Так что '<5' становится id = 1, следующая строка'> = - 5 и <-2' становится id = 5 и так далее, пока '> = 3 и <5' не станет id = 10 ... тогда что ? –
@TT. От 3 до 4 - 9. От 5 до 60 - 10. – Kason
@Loser Я просто работаю над списком. Начиная со второй строки, условие выглядит как '> = предыдущее имя И <текущее имя ---> текущий идентификатор. –