Jacek Gaża

Jacek Gaża IT Manager, Tamtron
S.A.

Temat: Jak pobrać wartości maksymalne z danego okresu czasu

Witam Wszystkich,
Mam oto taki problem. Jest tabela w której zapisywane są dane dotyczące ilości materiału wyprodukowanego przez fabrykę. Dane zapisywane są jako suma poprzedniej wartości i obecnej. Ilość materiału cały czas rośnie aż do momentu wykasowania licznika przez obsługę. Jeżeli spojrzymy na dane jak na wykres to będzie to wyglądało jak funkcja liniowa aż do momentu wyzerowania w którym to wykres będzie rysowany znowu od 0. Nie jest powiedziane ile razy obsługa może wykasować liczniki - może 1 raz na zmianę ale może i 10. Pytanie czy jestem w stanie w MSSQL2005 pobrać wartości peaków ( wartości maksymalne w zadanym okresie czasu ).
Rozwiązałem ten problem z całkiem innej strony ale jestem ciekawy czy da się to zrobić w MSSQL2005 ( bo w Oracle nie ma problemu )
Przykład odczytu licznika:
godz. 8.00 - stan licznika 0
godz. 8.30 - stan licznika 2209
godz. 9.00 - stan licznika 4210<- tu mamy pierwszy peak
godz. 9.05 - stan licznika 0
godz. 9.30 - stan licznika 2024
godz. 10.00 - stan licznika 4520
godz. 10.30 - stan licznika 6899
godz. 11.00 - stan licznika 9200<- drugi peak
godz. 11.01 - stan licznika 0
...
...
i tak dalej
Pozdrawiam
Jacek
Adam O.

Adam O. Bazy danych etc

Temat: Jak pobrać wartości maksymalne z danego okresu czasu

Zakładając takie środowisko testowe:


create table licznik (godzina datetime, stan integer)
delete from licznik

insert into licznik (godzina, stan)
select
'2011-01-01T08:00:00', 0
union all select
'2011-01-01T08:30:00', 2209
union all select
'2011-01-01T09:00:00', 4210
union all select
'2011-01-01T09:05:00', 0
union all select
'2011-01-01T09:30:00', 2024
union all select
'2011-01-01T10:00:00', 4520
union all select
'2011-01-01T10:30:00', 6899
union all select
'2011-01-01T11:00:00', 9200
union all select
'2011-01-01T11:01:00', 0


Ja bym pewnie popełnił coś takiego:


;with widelki(godzina_min, godzina_max)
as
(
select basel.godzina,
(select min(l1.godzina)
from licznik l1
where l1.stan = 0 and l1.godzina > basel.godzina)
from licznik basel
where basel.stan = 0
)
select godzina_min, godzina_max,
(
select MAX(stan)
from licznik
where godzina between godzina_min and godzina_max
)
from widelki
where godzina_max is not null


Pewnie można pokombinować z ostatnim przedziałem, w zależności czy go chcesz mieć w wynikach czy nie.

konto usunięte

Temat: Jak pobrać wartości maksymalne z danego okresu czasu

Nie wiem czy na MSSQL, ale na SQLite zadziałało:


select
(select count(*) from licznik l1
where l1.stan = 0
and l1.godzina <= l2.godzina) as etap,
max(l2.stan) as peak
from licznik l2
group by etap
Jacek Szajer

Jacek Szajer Współwłaściciel,
Business
Intelligence
Technologies SC

Temat: Jak pobrać wartości maksymalne z danego okresu czasu

Nie wiem czy dobrze zrozumiałem treść zadania, ale jeśli chcemy otrzymać:

godzina stan
----------------------- -----------
2011-01-01 09:00:00.000 4210
2011-01-01 11:00:00.000 9200

to na MSSQL można np. tak:


select *
from licznik as A
where godzina between '2011-01-01T08:00:00' and '2011-01-01T11:01:00'
and stan>(select top 1 stan from licznik as B where A.godzina<B.godzina)



Wyślij zaproszenie do