Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как составить запрос

315
03 августа 2006 года
Nick_M
399 / / 29.05.2003
Никак не соображу.
Есть MS SQL 2000. Есть таблица create table #temp(summa float). Допустим в ней такие данные:
23
15
7
6
14
9
43
26
Нужно вычислить количество снижений значения поля summa меньше 10. Т.е. при этих данных будет 2 снижения (с 15 до 7 и с 14 до 9). Я мог бы конечно открыть курсор по таблице, но не хотелось-бы.
385
03 августа 2006 года
SomewherSomehow
477 / / 25.07.2004
Я вижу только один путь - цикл.
315
03 августа 2006 года
Nick_M
399 / / 29.05.2003
[QUOTE=SomewherSomehow]Я вижу только один путь - цикл.[/QUOTE]
Тобишь курсор. Чего-бы не хотелось. Я где-то встречал похожее решение. Там надо было вычислить разницу между соседними записями. Это было соединение таблицы самой с собой. Здесь что-то такое напрашивается.
Ну я добавил столбец identity еще.
 
Код:
create table #temp (counter int identity not null, summa float)
insert into #temp .....
delete from #temp where summa is null

Получаем таблицу

counter | summa
2 | 23
3 | 15
5 | 7
7 | 6
8 | 14
11 | 9
12 | 43
13 | 26
385
03 августа 2006 года
SomewherSomehow
477 / / 25.07.2004
не обязательно курсор, если таблица временная, то можно из нее в цикле удалять записи, просто делать селект топ 1, а потом делет. только для этого нужен уникальный ключ, так что правильно что сделал. Запросом твою задачу не решишь, если кто решит - пришлите пожалуйста, оченно интересно было бы взглянуть =)
А почему не устраивает курсор, ведь если ему установить опции рид_онли,статик, форвард_онли,локал, то он будет довольно быстро работать...

В общем либо с курсором, либо без, мое мнение - по-любому цикл.
13
03 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Согласен... Одним обычным запросом тут пожалуй никак. Пиши хранимую процедуру и там в цикле все по временной таблице.
315
03 августа 2006 года
Nick_M
399 / / 29.05.2003
[QUOTE=SomewherSomehow]не обязательно курсор, если таблица временная, то можно из нее в цикле удалять записи, просто делать селект топ 1, а потом делет. только для этого нужен уникальный ключ, так что правильно что сделал. Запросом твою задачу не решишь, если кто решит - пришлите пожалуйста, оченно интересно было бы взглянуть =)
А почему не устраивает курсор, ведь если ему установить опции рид_онли,статик, форвард_онли,локал, то он будет довольно быстро работать...

В общем либо с курсором, либо без, мое мнение - по-любому цикл.[/QUOTE]
Нашел на другом форуме решение:
 
Код:
select
  count(*)
from
  #temp t1
where
  t1.summa >= 10 and (select top 1 summa from #temp where counter > t1.counter) < 10

Как раз то что нужно. Ведь помнил же что обычным запросом можно!
385
04 августа 2006 года
SomewherSomehow
477 / / 25.07.2004
Спасибо! Хороший способ, возьмем на вооружение! Действительно можно без циклов =)
385
04 августа 2006 года
SomewherSomehow
477 / / 25.07.2004
да. вернет 1. т.е. было одно снижение суммы, которое перевалило рубеж в 10.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог