[PL-SQL] Przedzialy czasowe
Sławek Mróz - 30-10-2005 10:51
[PL-SQL] Przedzialy czasowe
Witam!
Mam sobie tabelke w bazie Oraclowej, dajmy na to z nastepujacymi kolumnami:
'id' - czyli id zlecenia 'status' - czyli osiagniety status zlecenia 'czas' - czyli czas wykonywania jakiejs tam operacji.
Jak skonstruowac zapytanie, zeby zwrocilo mi ilosci wykonanych operacji (czyli ilosci rekordow) dla ustalonych przeze mnie przedzialow czasowych, np:
status1, 8-8.59, 2 status1, 9-9.59, 5 status1, 10-10.59 - 8 status2, 8-8.59, 5
itd, itp.
Zapewne przyda sie tu SUM i CASE, ale nie do konca wiem, jakiej dokladnie skladni uzyc, bo eksperymenty z 'between' oraz >='8:00' and <'9:00' nie powiodly sie.
Gdyby jeszcze udalo sie zapisac taki warunek, ze do zliczania brane sa tylko wartosci minimalne czasu dla konkretnego zlecenia i statusu (bo o dziwo w bazie zlecenie moze osiagnac ten sam status wielokrotnie, zas mnie interesuje, kiedy osiagnieto dany status po raz pierwszy), to juz byloby rewelacyjnie.
Dzieki z gory, w razie problemow ze zrozumieniem tego pokreconego problemu, sluze pomoca:)
Pozdr Slawek
fasol - 30-10-2005 10:51
> Mam sobie tabelke w bazie Oraclowej, dajmy na to z nastepujacymi kolumnami: > > 'id' - czyli id zlecenia > 'status' - czyli osiagniety status zlecenia > 'czas' - czyli czas wykonywania jakiejs tam operacji. > > > Jak skonstruowac zapytanie, zeby zwrocilo mi ilosci wykonanych operacji (czyli ilosci > rekordow) dla ustalonych przeze mnie przedzialow czasowych, np: > > status1, 8-8.59, 2 > status1, 9-9.59, 5 > status1, 10-10.59 - 8 > status2, 8-8.59, 5 > > itd, itp. > > Zapewne przyda sie tu SUM i CASE, ale nie do konca wiem, jakiej dokladnie skladni > uzyc, bo eksperymenty z 'between' oraz >='8:00' and <'9:00' nie powiodly sie. > > Gdyby jeszcze udalo sie zapisac taki warunek, ze do zliczania brane sa tylko wartosci > minimalne czasu dla konkretnego zlecenia i statusu (bo o dziwo w bazie zlecenie moze > osiagnac ten sam status wielokrotnie, zas mnie interesuje, kiedy osiagnieto dany > status po raz pierwszy), to juz byloby rewelacyjnie. > > Dzieki z gory, w razie problemow ze zrozumieniem tego pokreconego problemu, sluze > pomoca:) >
to_char to_date
http://www.techonthenet.com/oracle/
Morff - 30-10-2005 10:51
Sławek Mróz napisał(a): > Witam! > > Mam sobie tabelke w bazie Oraclowej, dajmy na to z nastepujacymi kolumnami: > > 'id' - czyli id zlecenia > 'status' - czyli osiagniety status zlecenia > 'czas' - czyli czas wykonywania jakiejs tam operacji. > > > Jak skonstruowac zapytanie, zeby zwrocilo mi ilosci wykonanych operacji (czyli ilosci > rekordow) dla ustalonych przeze mnie przedzialow czasowych, np: > > status1, 8-8.59, 2 > status1, 9-9.59, 5 > status1, 10-10.59 - 8 > status2, 8-8.59, 5
select id,status,count(*) as ile from tabelka where to_char(czas,'HH24') = '&Godzina' group by id,status
to akurat najłatwiejszy przypadek , bo w przykładzie pokazałeś ze przedział wynosi godzine ..
select id,status,count(*) as ile from tabelka where to_char(czas,'HH24:MI') between '&Od' and '&Do' group by id,status
gdzie np. od = 10:00 , do = 10:59
> Gdyby jeszcze udalo sie zapisac taki warunek, ze do zliczania brane sa tylko wartosci > minimalne czasu dla konkretnego zlecenia i statusu (bo o dziwo w bazie zlecenie moze > osiagnac ten sam status wielokrotnie, zas mnie interesuje, kiedy osiagnieto dany > status po raz pierwszy), to juz byloby rewelacyjnie.
gdybyś miał jakiś klucz główny w tej tabeli , byłoby łatwiej .. Zadam pytanie pomocnicze ... Po co zliczać czasy minimalne statusów ? jezeli status wystąpił pierwszy raz o 10:00 to jezeli wybierzesz przedział 11:00 - 11:59 to nie chcesz go zobaczyć ?
-- Pozdrawiam Morff ---------- AQQ 141151
Sławek Mróz - 30-10-2005 10:51
(...) Dzieki za sugestie, bede analizowac:)
> gdybyś miał jakiś klucz główny w tej tabeli , byłoby łatwiej .. > Zadam pytanie pomocnicze ... Po co zliczać czasy minimalne statusów ? > jezeli status wystąpił pierwszy raz o 10:00 to jezeli wybierzesz przedział 11:00 - > 11:59 to nie chcesz go zobaczyć ?
Akurat dla potrzeb tego raportu nie potrzebuje pozostalych, tylko ten najwczesniejszy. Z kluczem glownym jest klopot. To baza, do ktorej w zasadzie mam dostep read-only.
Jezeli mimo to uda sie znalezc jakies rozwiazanie, bede wdzieczny:)
Pozdr Slawek
fasol - 30-10-2005 10:51
> > Akurat dla potrzeb tego raportu nie potrzebuje pozostalych, tylko ten najwczesniejszy. > Z kluczem glownym jest klopot. To baza, do ktorej w zasadzie mam dostep read-only. > > Jezeli mimo to uda sie znalezc jakies rozwiazanie, bede wdzieczny:) >
Jeżeli interesuje Cię tylko kiedy po raz pierwszy osiągnięto określony status to tylko
select 'Status 1' as Status, min(czas) as Pierwsze from tabelka where to_char(czas,'hh24mi') between '0700' and '0729'
union
select 'Status 2' as Status, min(czas) from tabelka where to_char(czas,'hh24mi') between '0730' and '0759';
A na marginesie to w ORACLU zamiast klucza głównego można użyć ROWID
Morff - 30-10-2005 10:51
fasol napisał(a):
> Jeżeli interesuje Cię tylko kiedy po raz pierwszy osiągnięto określony > status to tylko
nie rozumiem stwierdzenia "tylko" i podziału na połowy godziny i uniona ..
SELECT id,COUNT(*) FROM tabelka WHERE (id,status,czas) IN (SELECT id,status,MIN(czas) FROM tabelka WHERE to_char(czas,'HH24:MI') BETWEEN '&OD' AND '&DO' GROUP BY id,status) GROUP BY id
> A na marginesie to w ORACLU zamiast klucza głównego można użyć ROWID
... super
-- Pozdrawiam Morff ---------- AQQ 141151
fasol - 30-10-2005 10:51
> nie rozumiem stwierdzenia "tylko" i podziału na połowy godziny i uniona .. > > SELECT id,COUNT(*) > FROM tabelka > WHERE > (id,status,czas) > IN > (SELECT id,status,MIN(czas) > FROM > tabelka > WHERE to_char(czas,'HH24:MI') BETWEEN '&OD' AND '&DO' > GROUP BY id,status) > GROUP BY id >
Co Ty tu insynuujesz. Od kiedy mozna użyć IN w takiej konstrukcji? Tego nawet ORACLE nie przełknie. Przynajmniej w wersji 8. A przede wszystkim to określ co chcesz osiągnąć.
Morff - 30-10-2005 10:51
fasol napisał(a):
> Co Ty tu insynuujesz. > Od kiedy mozna użyć IN w takiej konstrukcji? Tego nawet ORACLE nie > przełknie. Przynajmniej w wersji 8.
insynuuję ze w wersji 8.1.7 przełknie ...
A przede wszystkim to określ co chcesz > osiągnąć.
pokazać ze dla danego ID_zlecenia status zmienił sie np 3 razy w zadanym okresie czasu.
-- Pozdrawiam Morff ---------- AQQ 141151
Morff - 30-10-2005 10:51
> insynuuję ze w wersji 8.1.7 przełknie ...
oo ... na 8.1.6.2 też zadziałało .. więc insynuuję na na 8i zadziała :)
-- Pozdrawiam Morff ---------- AQQ 141151
fasol - 30-10-2005 10:51
> > insynuuję ze w wersji 8.1.7 przełknie ... > > oo ... na 8.1.6.2 też zadziałało .. > więc insynuuję na na 8i zadziała :) > No dobrze zadziała. Ale Ty nie odpowiadasz na pytanie, który rekord jest najwcześniejszy z tych trzech co zdarzyły sie w okreslonym czasie.
Morff - 30-10-2005 10:51
fasol napisał(a): >>>insynuuję ze w wersji 8.1.7 przełknie ... >> >>oo ... na 8.1.6.2 też zadziałało .. >>więc insynuuję na na 8i zadziała :) >> > > No dobrze zadziała. Ale Ty nie odpowiadasz na pytanie, który rekord jest > najwcześniejszy z tych trzech co zdarzyły sie w okreslonym czasie.
pytanie było :
Gdyby jeszcze udalo sie zapisac taki warunek, ze do zliczania brane sa tylko wartosci minimalne czasu dla KONKRETNEGO ZLECENIA I STATUSU (bo o dziwo w bazie zlecenie moze osiagnac ten sam status wielokrotnie, zas mnie interesuje, kiedy osiagnieto dany status po raz pierwszy), to juz byloby rewelacyjnie.
ja tak zrozumiałem zadanie .. A żeby pokazać najwcześniejszą datę statusu w danym okresie czasu nie trzeba by tak kombinować.
-- Pozdrawiam Morff ---------- AQQ 141151
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[newbie] MS SQL - praca =?ISO-8859-2?Q?jednocze=B6nie_na_2_?==?ISO-8859-2?Q?bazach_=28linkowanie_=3F=29?=
ms sql server - =?ISO-8859-2?Q?domy=B6lny_format_kolumn_ty?==?ISO-8859-2?Q?pu_datetime?=
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|