2015-11-23 5 views
2

мне нужно, чтобы получить MIN и MAX датирует по объему, но мне нужно сгруппировать его в зависимости от объема и не весь объем такого же количества ....MIN MAX запрос с твист

В принципе, у меня есть ежедневно объема и даты для ежедневного объема. Мне нужно получить MIN Date как «to» и MAX date как «from» для набора тома.

Обратите внимание, что громкость может пересекать даты, а затем прерывать, а затем иметь новый набор дат для того же тома.

Надеюсь, скриншоты ниже помогут вам лучше объяснить, чем я могу. Я знаю, как это сделать с помощью кода .. но было интересно, возможно ли это с SQL.

Пожалуйста, обратите внимание, что SQL будет вызываться из приложения, и я не могу вставить временную таблицу, чтобы получить мой конечный набор данных результата ...

Вот исходные данные, которые я запрашивая с помощью выберите *:

[Raw Data]

Вот что я в конечном счете хочу:

[End Result I am Looking For]

Запрос, который я запускаю, дает мне MIN и MAX для всех вхождений тома 1100. Я хочу, чтобы он был разбит на основе разрыва между датами, как показано в скриншоте конечного результата ....

Вот мой SQL:

SELECT daily_volume, MIN(volume_date) AS min_date, MAX(volume_date) AS max_date, ins_num 
FROM daily_volume 
WHERE ins_num = 3854439 
GROUP BY daily_volume, ins_num 
+2

Пожалуйста, помечать СУБД. Кроме того, принятый ответ на вопрос [this] (http://stackoverflow.com/questions/33811993/how-do-i-exclude-rows-when-incremental-value-starts-over) может помочь решить вашу проблему , –

ответ

0

следующая была написана для SQL-сервера, но он должен работать для других баз данных (sqlfiddle):

with DatesMinMax as 
(
    select 
     volume_date, 
     daily_volume, 
     isnull 
     (
      (
      select top 1 d2.volume_date 
      from daily_volume d2 
      where d.volume_date > d2.volume_date and d.daily_volume <> d2.daily_volume 
      order by d2.volume_date desc 
      ) 
      , '1753-01-01' 
     ) as min_date, 
     isnull 
     (
      (
      select top 1 d2.volume_date 
      from daily_volume d2 
      where d.volume_date < d2.volume_date and d.daily_volume <> d2.daily_volume 
      order by d2.volume_date 
      ) 
      , '9999-12-31' 
     ) as max_date 
    from daily_volume d 
), 
DatesFromTo as 
(
    select d1.daily_volume as qty, 
     (select min(d2.volume_date) 
     from DatesMinMax d2 
     where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date 
     ) as [from], 
     (select max(d2.volume_date) 
     from DatesMinMax d2 
     where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date 
     ) as [to] 
    from DatesMinMax d1 
) 
select distinct 
    qty, 
    [from], 
    [to] 
from DatesFromTo 
order by [from] 

DatesMinMax используется, чтобы получить первую дату, которая имела разный объем, чем текущий объем

DatesFromTo используется, чтобы получить диапазон дат для каждой строки

+0

Адуччи, ты гений. Это работало как чемпион! Мне пришлось добавить фильтр ins_num, чтобы возвращать только те значения, которые я искал, но это сработало. Я также попробовал метод разделения, предложенный julien, и это тоже сработало. – bimini07