MAX przedział SQL

0

Kilka wątków niżej pomogliście mi w jednym problem za co bardzo dziękuje.
Po wdrożeniu go do mojej bazy od razu nasunęło mi się pytanie czy jest możliwe znalezienie przedziału INT dla którego SUM(int) dla poszczególnego tygodnia ma wartość MAX

Przykład jeżeli dodany taki przedział 2.2 and 2.4 to wskakują nad wartości na plus w tygodniu np. 3 i 9.
I chciałbym tak napisać query żeby podało mi wartość przedziału min i max żeby wartość sum(int) była max

select [week], case when min(case when w>r then 1 else 0 end)=1 then 100*sum([int]) else -100 end as wynik from test where w is not null  group by [week]select [week], case when min(case when w>r then 1 else 0 end)=1 then 100*sum([int]) else -100 end as wynik from test where w is not null and int between 2.2 and 2.4 group by [week]

Poniżej dane i query
http://sqlfiddle.com/#!18/eb0aec/36

0

Takie coś? Jak nie to prośba opisz problem bardziej klarownie.

select week,max([int]) as 'week_max', min([int]) as 'week_min' from TEST 
where [int] between 2.2 and 2.4
group by [week]
0

Nie :-)

Chodzi mi o to żeby Querrey podało min właśnie ten zakres kin Inman przedziału dla którego byłby max (int) . Innaczej sprawdzał każdy przedział i podał min wartość max(int)

0

Może spróbuj to opisać bez skrótów myślowych i wtrąceń pseudokodowych. Tak opisowo, jak gdybyś miał to wytłumaczyć dziadkowi, żeby ten mógł to wyliczyć na kartce...

0

OK to jeszcze raz od początku. Bo faktycznie złe to chyba napisałem
Zaczynając
Mamy query główne

select [week], case when min(case when w>r then 1 else 0 end)=1 then 100*sum([int]) else -100 end as wynik 
from test where w is not null 
group by [week]

zawężając dane do 5 tygodni (7 pierwszych rekordów) na przykładzie powiem o co mi chodzi
http://sqlfiddle.com/#!18/7bfd4/8
Sumując teraz kolumnę Wynik dostajemy wartość -55
jednak zawyżając zakres int do

int between 2.2 and 2.5

http://sqlfiddle.com/#!18/7bfd4/14

Dostajemy wynik 265

I teraz potrzebuje tak przerobić to query żeby podało mi przedział int dla którego sum(wynik) jest max (query ma zwrócić przedział zamknięty wartości int np <1.2:4.4> dla którego suma wyniku z poszczególnych tygodni będzie maksymalna)

dzięki za cierpliwość =]

0

Przekładając to na polski...
Chodzi ci o zapytanie, które dla każdego tygodnia zwróci dwie liczby [A] i [B], dla których istniejące już zapytanie (podane przez Ciebie) z warunkiem WHERE INT between [A] and [B] zwróci najwyższa wartość. Dobrze to zrozumiałem?

I chcesz to zrobić jednym Selectem bez użycia funkcji?

Na pierwszy rzut oka zadanie wydaje się być dosyć ambitne.

Ilu rekordów w tabeli się spodziewasz?

3

Nie wiem czy dobrze rozumiem, ale w ten sposób:

with minmax  as (
select 
    minValue
    ,maxValue 
from 
    (select distinct 
        int minValue 
    from 
        test) minvalues
    inner join (select distinct 
                    int maxValue 
                from test) maxvalues on minvalues.minvalue < maxvalues.maxvalue
  )

select top 1  
    minvalue
    ,maxvalue
    ,sum(wynik) e 
from (
    select 
        [week]
        , minValue
        ,maxvalue
        ,case when min(case when w>r then 1 else 0 end)=1 then 100*sum([int]) else -100 end as wynik 
    from 
        test
        inner join minmax on test.int between minmax.minvalue and minmax.maxvalue
    where 
        w is not null 
    group by 
        [week]
        , minValue
        ,maxvalue) dt
group by 
    minvalue
    ,maxvalue
order by 
    3 desc

http://sqlfiddle.com/#!18/7bfd4/26

0

Dzieki wielkie testowałem przez pare dni to querry i super działa ;-) thx

1 użytkowników online, w tym zalogowanych: 0, gości: 1