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

Откуда: Алтайский край
Сообщений: 210
Добрый день



Мне интересно возможно ли, если да, то какой логикой, преобразовать набор :
id        f1              f2            
1        250,00       34,00 
2        50,00         55,22
3        31,20         31,20
4        49,00         40,00
5        22,00         10,55
6        19,00         19,00
7        62,00         100,00
8        73,01         96,33 
9        101,00       101,00

к виду :

id        f1              f2                 somefield    
1        250,00       34,00                 1
2        50,00         55,22                 1 
3        31,20         31,20                 2  
4        49,00         40,00                 3 
5        22,00         10,55                 3
6        19,00         19,00                 4  
7        62,00         100,00               5
8        73,01         96,33                 5 
9        101,00       101,00               6

Мне надо сгрупировать данные f2 по полю somefield. Хочется чтобы строки групперовались до строки где f1=f2 не включая ее, затем после это строки до следующей где f1=f2.

Кода я не прошу. мне просто идею бы. или какими средствами
25 май 11, 07:28    [10703614]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании скрипта  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @T TABLE(id INT,f1 DEC(10,2),f2 DEC(10,2));
INSERT @T(id,f1,f2) VALUES
 (1,        250.00,       34.00)
,(2,        50.00,         55.22)
,(3,        31.20,         31.20)
,(4,        49.00,         40.00)
,(5,        22.00,         10.55)
,(6,        19.00,         19.00)
,(7,        62.00,         100.00)
,(8,        73.01,         96.33)
,(9,        101.00,       101.00);

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(ORDER BY id)-ROW_NUMBER()OVER(PARTITION BY SIGN(ABS(f1-f2)) ORDER BY id),* FROM @T)
SELECT MIN(id)MIN_id,MAX(id)MAX_id,MIN(f1)MIN_f1,MIN(f2)MIN_f2,MAX(f1)MAX_f1,MAX(f2)MAX_f2
FROM CTE
WHERE f1<>f2
GROUP BY N
ORDER BY MIN(id);
25 май 11, 09:40    [10704008]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании скрипта  [new]
TimRX
Member

Откуда: Алтайский край
Сообщений: 210
iap ,
Спасибо.
25 май 11, 10:09    [10704192]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании скрипта  [new]
TimRX
Member

Откуда: Алтайский край
Сообщений: 210
Возникла потребность включать в суммирование первую и последнюю строку где f1=f2 т.е

Было
id        f1              f2            
1        250,00       34,00 
2        50,00         55,22
3        31,20         31,20
4        49,00         40,00
5        22,00         10,55
6        19,00         19,00
7        62,00         100,00
8        73,01         96,33 
9        101,00       101,00
Надо

id        f1              f2                 somefield    
1        250,00       34,00                 1
2        50,00         55,22                 1 
3        31,20         31,20                 1  
4        37,40         37,40                 2  
5        45,03         45,03                 3  
6        49,00         40,00                 3 
7        22,00         10,55                 3
8        19,00         19,00                 5  
9        62,00         100,00               5
10        73,01         96,33                5 
11        101,00       101,00               6

Т.е если записей с f1=f2 идущих подряд >1 то первой строке с таким условием проставляется номер в somefield как у предыдущей строки,т.е она попадает в верхнюю группировку по somefield. Соответственно последняя строка с таким условие в нижнюю. Если записей с f1=f2 идущих подряд = 1 то в нижнюю.
Объяснение конечно так себе, но я попытался мысль отобразить на примере выше.
6 июн 11, 08:26    [10767035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить