![]() |
|
SQL: заменить в выборке максимум на предыдущий максимум | ☑ | ||
---|---|---|---|---|
0
dk
29.11.12
✎
14:41
|
Исходные:
MS SQL 2000 темповая таблица вида товар - продажи Задача: Удалить из выборки 1 максимальное значение продаж (макс1), на предыдущее максимальное значение продаж (макс2), при условии что макс1 > макс2 на более чем 20% Что есть:
т.е. получить макс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
|
в общем задачку решил, всем спб
--- если кому интересно
|
|||
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 в основном запросе и привет. как-то так. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |