Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 28 odgovora
  • 10.577 pregleda

Najnovija ↓

Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 27.12.2005. u 14:40 · pre 254 meseca #21
Citat:
jablan:Je l' si se ti setio ovog ili si negde pokupio fazon?


Nije ti to fazon, vec nacin ispravnog pristupa postavljenom problemu. Ako zadatke ovakvog tipa pokusavas da resis nekakvim grupisanjem i koriscenjem agregatnih funkcija, znaj da je tvoj nacin razmisljanja pogresan.

Pozdrav

Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 27.12.2005. u 14:56 · pre 254 meseca #22
Citat:
branimir.ts: Nije ti to fazon, vec nacin ispravnog pristupa postavljenom problemu. Ako zadatke ovakvog tipa pokusavas da resis nekakvim grupisanjem i koriscenjem agregatnih funkcija, znaj da je tvoj nacin razmisljanja pogresan.

Pozdrav


Opasna generalizacija, molim te uzdrži se ovakvih komentara, i nisi baš neki utisak ostavio svojim "rešenjem".
Potpis
Nisam ni znao da znam dok nisam prob'o!
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 27.12.2005. u 15:10 · pre 254 meseca #23
Citat:
CandyMan: Opasna generalizacija, molim te uzdrži se ovakvih komentara, i nisi baš neki utisak ostavio svojim "rešenjem".


Resenje je resenje i sluzi za resavanje, a ne za ostavljanje utisaka.

Sem toga sto je tvoj query nezavistan od SQL sistema na kom se izvrsava, ne vidim ni jednu jedinu prednost nad mojom SQL konstrukcijom. Cak ce tvoj query sporije raditi nad relativno velikim tabelama.

Pozdrav
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 27.12.2005. u 16:08 · pre 254 meseca #24
Hteo ti ili ne, samim tim što si se javio na forumu, ostavljaš nekakav utisak. Definitivno je jasno da si tvrdoglav, a to što želiš po svaku cenu da nametneš svoje rešenje je neukusno. Tvoja "SQL konstrukcija" je proizvod minimalnog vremena provedenog u razmišljanju, što bi moglo da se protumači kao uvreda čitalaca foruma, pošto nisi uložio više truda da sagledaš i rešiš problem. Nemam ništa protiv da ovo što sam ja napravio zoveš upitom, ali to što si ti svoj proizvod nazvao konstrukcijom opet govori o (samo)kritičkoj atmosferi u kojoj radiš. Konkretnije ne treba komentarisati.

Code:
(select top 1  obj FROM Tabela t where t.obj = tmp.obj order by [ID] desc) as [Obj]
Potpis
Nisam ni znao da znam dok nisam prob'o!
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 27.12.2005. u 16:30 · pre 254 meseca
izmenjeno 1 put, poslednji put branimir.ts 28.12.2005. u 11:55
  1. branimir.ts28.12.2005. u 11:55zapis iz teksta poruke
#25
Citat:
CandyMan: Tvoja "SQL konstrukcija" je proizvod minimalnog vremena provedenog u razmišljanju


Prvo, ja ne namecem nikome svoje resenje kao konacno i definitvno.

Naravno da je vreme veoma bitno u savremenom IT svetu. A koliko vidim ti non stop ponavljas jedan te isti query u razlicitim kontekstima , pa covek ima utisak da nisi dalje odmakao od te 1996 godine kada si prvi put upamtio smisleni zadatak tadasnjeg profesora. Ko zna, mozda ti je toliko i trebalo od tad pa do danas da shvatis sta su correlated subqueries, i zasto tvoj query vraca one rezultate koje zaista vraca.

Vec sam ti rekao da je tvoja konstrukcija duplo sporija od one koju sam ja predstavio, to su cinjenice.

A ono sto si pomenuo da ce sporije raditi na tabelama sa par hiljada redova, tada si me zaista slatko nasmejao.

Posto vidim da analiziras moju SQL konstrukciju bez ikakvog komentara, ja cu malo baciti pogled na delove tvog SQL koda.

Citat:

CandyMan
Prvo predavanje predmeta "Strukture i baze podataka", profesor dr Veljko Malbaša, 1996. godina, pitanje za sve studente:
"Iz tabele sa radnicima i platama, izlistati podatke za prvu trojicu sa najvećom platom."
Kada se malo preformuliše dobije se:
"Izlistaj sve one koji po plati iznad sebe imaju manje od tri coveka - nijednog, jednog ili dva čoveka".


Profesor je sasvim jasno postavio pitanje, zasto si ga dodatno preformulisao?

Citat:

Rešenje:
Code:

select radnik, plata
  from radnik r
 where 3 > (select count(*)
              from radnik r2
             where r2.plata > r.plata)
order by 1,2



Kada si ga vec preformulisao na komplikovaniji nacin, tj izlistaj sve one koji po plati iznad sebe imaju manje od tri coveka, zasto nisi kao uslov postavio

Code:
where
           (select count(*)
              from radnik r2
             where r2.plata > r.plata) < 3 


vec

Code:
where 3 > (uslov)


ovo ?

Dalje, zasto si u ORDER klauzuli postavio redne brojeve kolona a ne njihove nazive?

I na kraju, zanimalo bi me kako bi postojeci query modifikovao tako da vraca tacno poslednja 2 pojavljivanja Obj, ali sa dodatnim uslovom da se Obj pojavio u tabeli najmanje 2 puta ?



Pozdrav
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 29.12.2005. u 11:26 · pre 254 meseca
izmenjeno 1 put, poslednji put CandyMan 29.12.2005. u 11:27
  1. CandyMan29.12.2005. u 11:27zapis iz teksta poruke
#26
Ovako...
Citat:
Profesor je sasvim jasno postavio pitanje, zasto si ga dodatno preformulisao?

Pitanje sam PREFORMULISAO što znači da nisam promenio smisao nego formu, oblik u cilju jasnijeg predstavljanja puta kojim se došlo do rešenja.
Citat:
where 3 > (uslov)

Ne vidim u čemu je problem - a > b je isto što i b < a

Citat:
zasto si u ORDER klauzuli postavio redne brojeve kolona a ne njihove nazive?

Kada pišeš mnogo upita u toku dana jasno je da određene stvari želiš da skratiš koliko je moguće - ORACLE dozvoljava da se kolone u ORDER BY referenciraju i po rednom broju osim po imenu. Mislim da su svi shvatili šta je pisac hteo da kaže.

Citat:
I na kraju, zanimalo bi me kako bi postojeci query modifikovao tako da vraca tacno poslednja 2 pojavljivanja Obj, ali sa dodatnim uslovom da se Obj pojavio u tabeli najmanje 2 puta ?

Vrlo rado.
U tabelu sam dodao jos jedan slog obj_id = 4 i id = 13, tako da obj_id 4 ima samo jedno pojavljivanje, svi ostali ispunjavaju uslov koji si postavio.

Code:

SQL> select * from test;

        ID     OBJ_ID
---------- ----------
         1          1
         2          2
         3          3
         4          3
         5          3
         6          1
         7          2
         8          2
         9          3
        10          3
        11          1
        12          1
        13          4

13 rows selected.

Stari upit
Code:

SQL> SELECT obj_id, id
       FROM test e
      WHERE 2 > (select count(*)
                   from test e2
                  where e2.id > e.id
                    and e2.obj_id=e.obj_id)
      ORDER BY obj_id, id desc;

    OBJ_ID         ID
---------- ----------
         1         12
         1         11
         2          8
         2          7
         3         10
         3          9
         4         13

7 rows selected.

Novi upit - svi koji imaju najmanje dva pojavljivanja
Code:

SQL> SELECT obj_id, id
       FROM test e
      WHERE 2 > (select count(*)
                     from test e2
                    where e2.id > e.id
                      and e2.obj_id=e.obj_id)
        AND obj_id in (select obj_id
                         from test
                        group by obj_id
                       having count(*) >= 2)
      ORDER BY obj_id, id desc;

    OBJ_ID         ID
---------- ----------
         1         12
         1         11
         2          8
         2          7
         3         10
         3          9

6 rows selected.


Naravno, voleo bih da vidim i tvoje rešenje, uz objašnjenje.
Potpis
Nisam ni znao da znam dok nisam prob'o!
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 29.12.2005. u 11:56 · pre 254 meseca
izmenjeno 2 puta, poslednji put branimir.ts 29.12.2005. u 12:15
  1. branimir.ts29.12.2005. u 12:15zapis iz teksta poruke
  2. branimir.ts29.12.2005. u 11:57zapis iz teksta poruke
#27
Citat:
CandyMan: Ovako...
Novi upit - svi koji imaju najmanje dva pojavljivanja
Code:

....AND obj_id in (select obj_id
                         from test
                        group by obj_id
                       having count(*) >= 2)
      ORDER BY obj_id, id desc;

    OBJ_ID         ID
---------- ----------
         1         12
         1         11
         2          8
         2          7
         3         10
         3          9

6 rows selected.

Naravno, voleo bih da vidim i tvoje rešenje, uz objašnjenje.


Jao, opet ti sa grupisanjem... A ja taman pomislio da razmisljas na pravi nacin.

Evo prvo izmene tvog SQL coda...

Dakle, svi koji imaju najmanje dva pojavljivanja ....
Code:

select  [obj], id
from test AS e
where
 (select count(*)  from test e2  where e2.id > e.id   and e2.obj=e.obj) < 2
]and 
(select count(*)  from test e3  where e3.obj=e.obj) >=2
order by obj, [id] DESC;


Nije mi jasno zasto nisi nastavio da razmisljas kako treba, vec si se "zapetljao sa grupisanjem"

Evo i moje izmenjene verzije koda:

Code:

SELECT t.id, t.obj
FROM test AS t
WHERE t.[id]  in  
 (select top 2 tmp.[id] from test as tmp where tmp.obj=t.obj order by  tmp.[id] desc )
and 
(select count(*) from test tmp where tmp.obj = t.obj ) >=2
ORDER BY obj, [id];


Bez obzira na sve, mislim da si daleko bolji SQL programer od vecine koji ovde dolaze na forum , i zelim da ti se ujedno zahvalim na ponudjenom odgovoru.

Ne znam ima li potrebe da komentarisem izmene koje su postavljene, prepostavljam da su ocigledne?

Pozdrav
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 29.12.2005. u 16:08 · pre 254 meseca #28
Evo još jednog rešenja, bez restrikcije na najmanje dva pojavljivanja
Code:

SQL> select test.obj_id, max(test.id) as id
       from test ,
            (select max(a.id) as maxofid,
                    a.obj_id
               from test a
              group by a.obj_id )  q1
      where test.id = q1.maxofid    (+)
        and test.obj_id = q1.obj_id (+)
      group by test.obj_id, q1.maxofid
      order by test.obj_id, max(test.id) desc;

    OBJ_ID         ID
---------- ----------
         1         12
         1         11
         2          8
         2          7
         3         10
         3          9
         4         13


/* Ver 2 */


select test.obj_id, max(test.id) as id
  from test left join (select max(test.id) as maxofid, 
                              test.obj_id
                         from test
                        group by test.obj_id )  qryTestMaxOfId 
               on (test.id = qrytestmaxofid.maxofid) and (test.obj_id = qrytestmaxofid.obj_id)
group by test.obj_id, qrytestmaxofid.maxofid
order by test.obj_id, max(test.id) desc

    OBJ_ID         ID
---------- ----------
         1         12
         1         11
         2          8
         2          7
         3         10
         3          9
         4         13


Nije mi jasno šta ti imaš protiv grupisanja!? GROUP BY postoji u ANSI SQL-u i svim mogućim implementacijama SQL-a!

Nego, Mr Correlated SubQueries, napiši neko rešenje bez TOP klauzule...
Potpis
Nisam ni znao da znam dok nisam prob'o!
Re: Zanimljiv problem iz SQL-a koji ne uspevam da resim 09.01.2006. u 09:38 · pre 253 meseca #29
@branimir.ts: Sam si rekao da neko napise SQL upit da je neovisan o RDBMS-u, a ti uporno koristis TOP iako nije podrzan kod svih RDBMS-a. Osim toga, i taj TOP interno u RDBMS-u radi GRUPISANJE, jer zeljeni rezultat jednostavno NE MOZES dobiti bez grupisanja...
Potpis
Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme