zapytanie skomplikowane? MSSQL
Adam - 15-01-2006 19:16
zapytanie skomplikowane? MSSQL
Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy ze mamy tabele w postaci
id ref data cena 1 qwe 2005-12-20 1,1 2 qwe 2005-12-21 1 3 qwe 2005-12-19 2 4 qwe 2006-01-01 3 5 zxc 2006-01-01 1 6 zxc 2006-01-01 4 7 zxc 2006-01-02 7 8 qwe 2006-01-02 9
Chce uzyskac zestawienie przedstawiajace referencja wraz z cena dla najwczesniejszej daty. Czyli tabele w postaci
id ref data cena 8 qwe 2006-01-02 9 7 zxc 2006-01-02 7
Baza to mssql
Brakuje mi skladni w postaci SELECT * FROM _test WHERE (id,data) IN (SELECT id,MAX(data) -- tyle ze w tym miejscu i tak mialbym problem z pobraniem id bo ponizej mam grupowanie po ref FROM _test GROUP BY ref)
Szerze mowiac nie wiem czy to az tak zlozone czy ja juz jestem tak zmeczony ze szukam nie wiadomo jakiego rozwiazania podczas gdy jest ono trywialne.
Pozdrawiam
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 15-01-2006 19:16
Adam wrote: > Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy > ze mamy tabele w postaci > > > id ref data cena > 1 qwe 2005-12-20 1,1 > 2 qwe 2005-12-21 1 > 3 qwe 2005-12-19 2 > 4 qwe 2006-01-01 3 > 5 zxc 2006-01-01 1 > 6 zxc 2006-01-01 4 > 7 zxc 2006-01-02 7 > 8 qwe 2006-01-02 9 > > > Chce uzyskac zestawienie przedstawiajace referencja wraz z cena dla > najwczesniejszej daty. > Czyli tabele w postaci > > id ref data cena > 8 qwe 2006-01-02 9 > 7 zxc 2006-01-02 7 > > > Baza to mssql > > Brakuje mi skladni w postaci > SELECT * > FROM _test > WHERE (id,data) IN > (SELECT id,MAX(data) -- tyle ze w tym miejscu i tak mialbym problem z > pobraniem id bo ponizej mam grupowanie po ref > FROM _test > GROUP BY ref) > > > Szerze mowiac nie wiem czy to az tak zlozone czy ja juz jestem tak zmeczony > ze szukam nie wiadomo jakiego rozwiazania podczas gdy jest ono trywialne.
Problem który występuje raz na tydzień, a ostatni nawet częściej. Ale przynajmniej sam spróbowałeś i do tego wygląda, że faktycznie jesteś zmęczony. :) Grupujesz po ref i po nim masz wyszukiwać, czyli (ref,data) a nie (id,date). Oczywiście wybierze 2 (albo więcej), jeśli są 2 dla tej samej daty, ale tak już musi być.
-- P.M.
Adam - 15-01-2006 19:16
Dnia Thu, 12 Jan 2006 23:50:35 +0100, Paweł Matejski napisał(a):
>> Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy >> ze mamy tabele w postaci [cut] >> Brakuje mi skladni w postaci >> SELECT * >> FROM _test >> WHERE (id,data) IN >> (SELECT id,MAX(data) -- tyle ze w tym miejscu i tak mialbym problem z >> pobraniem id bo ponizej mam grupowanie po ref >> FROM _test >> GROUP BY ref) [cut] > Problem który występuje raz na tydzień, a ostatni nawet częściej. > Ale przynajmniej sam spróbowałeś i do tego wygląda, że faktycznie jesteś > zmęczony. :) > Grupujesz po ref i po nim masz wyszukiwać, czyli (ref,data) a nie (id,date). > Oczywiście wybierze 2 (albo więcej), jeśli są 2 dla tej samej daty, ale tak już > musi być.
Napisałem id? a chodziło mi o ref, jednak zmeczenie, poza tym i tak nie moge w mssql uzyskac skladni where (costam, costam2), dlatego szukam pomocy tutaj.
Dzieki. Problem pozostaje aktualny.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 15-01-2006 19:17
Adam wrote: > Dnia Thu, 12 Jan 2006 23:50:35 +0100, Paweł Matejski napisał(a): > > >>>Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy >>>ze mamy tabele w postaci > > [cut] > >>>Brakuje mi skladni w postaci >>>SELECT * >>>FROM _test >>>WHERE (id,data) IN >>>(SELECT id,MAX(data) -- tyle ze w tym miejscu i tak mialbym problem z >>>pobraniem id bo ponizej mam grupowanie po ref >>>FROM _test >>>GROUP BY ref) > > [cut] > >>Problem który występuje raz na tydzień, a ostatni nawet częściej. >>Ale przynajmniej sam spróbowałeś i do tego wygląda, że faktycznie jesteś >>zmęczony. :) >>Grupujesz po ref i po nim masz wyszukiwać, czyli (ref,data) a nie (id,date). >>Oczywiście wybierze 2 (albo więcej), jeśli są 2 dla tej samej daty, ale tak już >>musi być. > > Napisałem id? a chodziło mi o ref, jednak zmeczenie, poza tym i tak nie > moge w mssql uzyskac skladni where (costam, costam2), dlatego szukam pomocy > tutaj.
Miałem lepsze zdanie o MSSQL (co wcale nie znaczy, że dobre ;) ).
select t.* from _test t, (select ref,max(data) as mdata from _test group by ref) as s where t.ref = s.ref and t.data = s.mdata
A to zadziała?
-- P.M.
wistocie - 15-01-2006 19:17
Użytkownik "Adam" <heaben@can.wait.pl> napisał w wiadomości news:i2dwdjilgiog$.7gp1csjpqgut.dlg@40tude.net... > Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy > ze mamy tabele w postaci > > > id ref data cena > 1 qwe 2005-12-20 1,1 > 2 qwe 2005-12-21 1 > 3 qwe 2005-12-19 2 > 4 qwe 2006-01-01 3 > 5 zxc 2006-01-01 1 > 6 zxc 2006-01-01 4 > 7 zxc 2006-01-02 7 > 8 qwe 2006-01-02 9 > > > Chce uzyskac zestawienie przedstawiajace referencja wraz z cena dla > najwczesniejszej daty. > Czyli tabele w postaci > id ref data cena > 8 qwe 2006-01-02 9 > 7 zxc 2006-01-02 7
w oracle dziala mozna tak (tutaj nie polecane)
select a.id,a.ref,a.data,a.cena from test a, ( select ref,max(data),id from test group by ref ) b where a.id=b.id order by a.data desc
albo jeszcze prosciej!
select a.id,a.ref,max(a.data) ,a.cena from test a group by ref order by 3 desc
Pozdrawiam
paszczak - 15-01-2006 19:17
Dnia Fri, 13 Jan 2006 01:04:39 +0100, Paweł Matejski napisał(a):
> Adam wrote: [cut] > Miałem lepsze zdanie o MSSQL (co wcale nie znaczy, że dobre ;) ). > > select t.* > from _test t, > (select ref,max(data) as mdata from _test group by ref) as s > where t.ref = s.ref and t.data = s.mdata > > A to zadziała?
A jak, przeslicznie działa, dzieki wielkie.
Pozdrawiam serdecznie
wistocie - 15-01-2006 19:17
Użytkownik "Adam" <heaben@can.wait.pl> napisał w wiadomości news:i2dwdjilgiog$.7gp1csjpqgut.dlg@40tude.net... > Witam, mam dzisiaj drobny problem ze złozeniem jednego zapytania. Załozmy> ze mamy tabele w postaci > > Szerze mowiac nie wiem czy to az tak zlozone czy ja juz jestem tak zmeczony > ze szukam nie wiadomo jakiego rozwiazania podczas gdy jest ono trywialne. > Sorry za zamieszanie.(Moj poprzedni post) Tutaj male sprostowanie. Oczywiscie to co wczesniej napisalem, nie na prawa dzialac na oracle (heh -symulatory), powinno za to na my-sql §:-) W oracle dziala z funkcja analityczna Rank. select id, ref, data,cena from (select id,cena, data, ref, rank () over (partition by ref order by id desc) u from _test) where u = 1 order by data desc Byc moze w MSSQL jest podobna funkcja analityczna, ktorej tu nalezalo by uzyc. Rozwiazanie podane przez P.M .... select t.* from _test t, (select ref,max(data) as mdata from _test group by ref) as s where t.ref = s.ref and t.data = s.mdata
Jest jak najbardziej poprawne, ale musi spelniac jeszcze zalozenie 1. Data w bazie jest przechowywana w pelnym formacie z godzinami minutami, (w swoim przykladzie podales format skrocony) - tak, aby nie zdazyl sie przypadek, kiedy dla jednego ref mamy kilka takich samych wartosci data Wtedy mozesz dostac w wyniku
1 qwe 2005-12-20 1,1 2 qwe 2005-12-20 1 3 qwe 2005-12-20 2 5 zxc 2006-01-01 1 6 zxc 2006-01-01 4
Pozdrawiam
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.pladwokat.keep.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 |
|