Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2009, 09:22   #1
Black_Guardian
 
Регистрация: 30.07.2009
Сообщений: 7
Вопрос Запрос: Сгруппировать остатки по периодам

Доброго кода вам!!!

есть таблица с ежедневными остатками на карте
Код:
CardNumber         DateRest           Rest
----------------  ---------------- ----------------
<НомерКарты>    28.07.2009         10000
<НомерКарты>    27.07.2009         10000
<НомерКарты>    26.07.2009         500
<НомерКарты>    25.07.2009         0
<НомерКарты>    24.07.2009         0
<НомерКарты>    23.07.2009         700
<НомерКарты>    22.07.2009         700
<НомерКарты>    21.07.2009         0
<НомерКарты>    20.07.2009         0
где
CardNumber - номер карты
DateRest - дата
Rest - исходящий остаток на эту дату

Необходимо сделать запрос таким образом что бы получилось следующие
Код:
CardNumber     DateA         DateB       Rest
-------------- ----------- ---------- -------
<НомерКарты> 27.07.2009 28.07.2009 10000
<НомерКарты> 26.07.2009 26.07.2009 500
<НомерКарты> 24.07.2009 25.07.2009 0
<НомерКарты> 22.07.2009 23.07.2009 700
<НомерКарты> 20.07.2009 21.07.2009 0
Т.е. выделить периоды с одинаковыми остатками.

Я додумался только до следующего
Код:
Select CardNumber, MIN(Date) as DateA, Max(Date) as DateB, Rest
From CardRest
where CardNumber = <НомерКарты>
Group BY CardNumber, Rest
Order by Max(Date) DESC
Но получается, что группируются все нули и период с нулевыми остатками 20.07.2009-25.07.2009

ЗЫ: ну или ткните в тему с пояснениями условий группировки записей
Black_Guardian вне форума Ответить с цитированием
Старый 30.07.2009, 11:16   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

СУБД? оконные функции доступны?
soleil@mmc вне форума Ответить с цитированием
Старый 30.07.2009, 13:22   #3
Black_Guardian
 
Регистрация: 30.07.2009
Сообщений: 7
По умолчанию

MS SQL 2005. Оконные функции никогда не использовал. Сейчас вот почитаю с чем их едят.
Black_Guardian вне форума Ответить с цитированием
Старый 30.07.2009, 13:48   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Так попробуйте

Код:
select *, Count(Rest) from CardRest
Group by Rest
psycho-coder вне форума Ответить с цитированием
Старый 30.07.2009, 14:09   #5
Black_Guardian
 
Регистрация: 30.07.2009
Сообщений: 7
По умолчанию

Цитата:
select *, Count(Rest) from CardRest
Group by Rest
не годится...
Black_Guardian вне форума Ответить с цитированием
Старый 30.07.2009, 14:48   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Почему? У меня результаты были как раз такие как вам нужны.

Или я не так Вас понял?
psycho-coder вне форума Ответить с цитированием
Старый 30.07.2009, 14:54   #7
Black_Guardian
 
Регистрация: 30.07.2009
Сообщений: 7
По умолчанию

мне не нужно количество записей поля Rest, мне нужно выделить записи с одинаковыми остатками причем строго по датам, т.е. если остаток изменился в каком-то дне, а потом опять стал таким же (например, как на примере с нулем), то эти записи должны считаться как 3-ри разные записи при группировке.

щас копаю в сторону RANK, но чувствую что мне нужна совершенно противоположная функция
Black_Guardian вне форума Ответить с цитированием
Старый 30.07.2009, 15:22   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

count(Rest) - для наглядности.
А по теме... Надо подумать.
psycho-coder вне форума Ответить с цитированием
Старый 30.07.2009, 17:29   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

немного добавил тестовых данных
и по тексту вроде все и так ясно что там происходит

Код:
with t
as
(select 123 CardNumber, to_date('20.07.2009', 'DD.MM.YYYY') DateRest, 0 Rest from dual union all
 select 123, to_date('21.07.2009', 'DD.MM.YYYY'), 0 from dual union all
 select 123, to_date('22.07.2009', 'DD.MM.YYYY'), 700 from dual union all
 select 123, to_date('23.07.2009', 'DD.MM.YYYY'), 700 from dual union all 
 select 123, to_date('23.08.2009', 'DD.MM.YYYY'), 700 from dual union all
 select 123, to_date('23.08.2009', 'DD.MM.YYYY'), 700 from dual union all
 select 123, to_date('23.08.2009', 'DD.MM.YYYY'), 700 from dual union all
 select 123, to_date('23.09.2009', 'DD.MM.YYYY'), 300 from dual union all
 select 123, to_date('24.07.2009', 'DD.MM.YYYY'), 0 from dual union all
 select 123, to_date('25.07.2009', 'DD.MM.YYYY'), 0 from dual union all
 select 123, to_date('26.07.2009', 'DD.MM.YYYY'), 500 from dual union all
 select 123, to_date('27.07.2009', 'DD.MM.YYYY'), 10000 from dual union all
 select 123, to_date('28.07.2009', 'DD.MM.YYYY'), 10000 from dual),
 
t2 as
(select   
  CardNumber,
  DateRest,
  lead(DateRest) over(partition by CardNumber order by DateRest) date_lead,
  Rest,
  lead(Rest) over(partition by CardNumber order by DateRest) rest_lead
 from t 
 )

select 
  CardNumber,
  min(DateA) DateA,
  DateB,
  max(Rest) Rest
from(
select
  CardNumber,
  daterest DateA,
  case 
  when rest<>rest_lead then daterest
  else nvl(date_lead, daterest)
  end DateB,
  Rest
from t2)
group by cardNumber, DateB
order by cardNumber, DateA
З.Ы.: пример тестил на Оракле - для МССКЛ поправьте синтаксис где нужно будет
soleil@mmc вне форума Ответить с цитированием
Старый 30.07.2009, 18:05   #10
NurNet
Пользователь
 
Аватар для NurNet
 
Регистрация: 30.07.2009
Сообщений: 14
По умолчанию

попробуй лучше так:
select * from cardrest group by(rest)
NurNet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
остатки от деления на паскале semennn Помощь студентам 1 01.04.2009 05:32
Запрос White БД в Delphi 0 18.09.2008 09:30
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50
Запрос Инночка БД в Delphi 1 01.05.2008 23:46