Имя: Пароль:
IT
 
SQL: заменить в выборке максимум на предыдущий максимум
0 dk
 
29.11.12
14:41
Исходные:
MS SQL 2000
темповая таблица вида товар - продажи
Задача:
Удалить из выборки 1 максимальное значение продаж (макс1), на предыдущее максимальное значение продаж (макс2), при условии что макс1 > макс2 на более чем 20%
Что есть:

DECLARE @d numeric(19,5)
DECLARE @s numeric(19,5)

SET @s = (Select max(ОборотКол)from ##mytemptableSrednie)
SET @d = (Select max(ОборотКол)from ##mytemptableSrednie where ОборотКол < @s)

Print @s
Print @d

т.е. получить макс1 и макс2 получилось, а вот с заменой данных пока заминка. Как поменять только 1 строку в выборке?
1 dk
 
29.11.12
14:45
на клиента вытащить данные пока не получается - около 10 млн записей - 1с вылетает нафиг
2 МихаилМ
 
29.11.12
14:47
чтобы поменять одну строку, у строк должен быть уникальный ключ
3 dk
 
29.11.12
14:55
могет цикл через курсор сделать с прерыванием?
4 sda553
 
29.11.12
15:03
Если нет ид, тогда
declare cn cursor for select * from. ...
Потом  Open, Fetch
Пишем данные в другую временную таблицу
Если попадает под наше условие меняем строку, и выставляем флаг чтобы только один раз
Нужные данные в новой выборке
5 dk
 
29.11.12
15:04
как там выйти из цикла по курсору?
6 sda553
 
29.11.12
15:11
(5) while @@fetch_status =0 or любое другое условие прерывания
begin
....
fetch next from....
end
close. ..
7 dk
 
29.11.12
15:15
спб, попробую
8 rs_trade
 
29.11.12
15:23
работа через курсор моветон. а можно табличку с тестовыми данными и что надо получить?
9 rs_trade
 
29.11.12
15:30
(2) а по условию проапдейтить не?
10 dk
 
29.11.12
15:35
(9) строк с одинаковыми макс1 может быть несколько
11 rs_trade
 
29.11.12
15:42
(10) их все надо изменить? условие не совсем понятно сформулировано.
12 dk
 
29.11.12
15:55
изменить 1 строку с Продажи = макс1 на макс2, при условии что макс1 > 1.2*макс2
13 sda553
 
29.11.12
15:56
(11) Если б все, было бы просто, одну надо среди абсолютно одинаковых строчек
14 dk
 
29.11.12
15:59
походу таки можно с ключом придумать, есть там разрез уникальный в пределах склад/товар/день
15 rs_trade
 
29.11.12
16:00
(13) так не бывает. нужны тогда еще условия. либо одну любую менять.
16 Лефмихалыч
 
29.11.12
16:01
ВЫБРАТЬ
 тт.Поле,
 МАКСИМУМ(тт.Показатель) как Показатель
Поместить АбсолютныйМаксимум
ИЗ ТвояТаблица как ТТ
СГРУППИРОВАТЬ ПО тт.Поле
;
ВЫБРАТЬ
 тт.Поле,
 МАКСИМУМ(тт.Показатель)
ИЗ ТвояТаблица как ТТ
ЛЕВОЕ СОЕДИНЕНИЕ АбсолютныйМаксимум
ПО тт.Показатель<АбсолютныйМаксимум.Показатель
СГРУППИРОВАТЬ ПО тт.Поле
17 dk
 
29.11.12
16:03
завтра продолжим
18 dk
 
30.11.12
09:00
в общем задачку решил, всем спб
---
если кому интересно

DECLARE @d numeric(19,5)
DECLARE @s numeric(19,5)

SET @s = (Select max(ОборотКол)from ##mytemptableSrednie)
SET @d = (Select max(ОборотКол)from ##mytemptableSrednie where ОборотКол < @s)

Print @s
Print @d

IF (@S > 0) AND (@S > @d*1.2)
BEGIN
   UPDATE ##mytemptableSrednie
   SET
       ОборотСеб = Темп.ОборотСеб / Темп.ОборотКол * @d
       , ОборотСум = Темп.ОборотСум / Темп.ОборотКол * @d
       , ОборотКол = @d
   FROM ##mytemptableSrednie Темп
   INNER JOIN (SELECT TOP 1 * FROM ##mytemptableSrednie WHERE ОборотКол = @s) Влож ON (Влож.Товар = Темп.Товар) AND (Влож.Склад=Темп.Склад) AND (Влож.День=Темп.День) AND (Влож.ОборотКол=Темп.ОборотКол)
END
19 Ёпрст
 
гуру
30.11.12
09:14
как бэ.. можно было и без апдейт обойтись..просто всё в селекте
20 Ёпрст
 
гуру
30.11.12
09:14
слепить
21 dk
 
30.11.12
09:16
(20) например
22 Ёпрст
 
гуру
30.11.12
09:23
ну, получить следующее макс значение в одной строке, можно так:

select
  t1.id,
  (select max(t2.id) from table as t2
   where t2.id<t1.id) as predid
from table as t1
order by t1.id

Ну а взять первое.. тупо через top 1..

ну а далее, то что выше в case в основном запросе и привет.
как-то так.