[ Orome @ 13.06.2017. 19:35 ] @
Imam sledecu situaciju u bazi

godina - artikl
2015 - 40
2016 - 40
2017 - 40
---------------
2015 - 41
2017 - 41
----------------
2016 - 50
2017 - 50
----------------
2017 - 55

potrebni su mi artikli koji postoje ili u sve tri godine (2015, 2016, 2017) ili u poslednje dve (2016, 2017) ili u poslednjoj 2017. Treba mi nacin da iskljucim artikl 41 koji postoji samo u 2015 i 2017. Jedino artikl 41 ne zadovoljava uslov za prikaz. Svaka pomoc je dobrodosla. Hvala unapred.

Edit : ili da ga iskljucim skroz ili da iskljucim samo red sa 2015 godinom kod artikla 41. Znaci ili skroz ili samo godinu koja nema 'nastavak' u sledecoj.
[ jablan @ 13.06.2017. 21:23 ] @
Sa tim editom na kraju si ga za*rao, sad ne razumem ništa. Da li ti trebaju artikli koji nemaju "rupe"?
[ Orome @ 14.06.2017. 06:03 ] @
pomoglo bi mi da ih izbacim skroz iz rezultata ili da zadrzim samo drugi red u kom je 2017. bilo sta od to dvoje. da napomenem da ne mora maksimalno biti 3 godine, moze i vise. u bilo kojoj situaciji mi trebaju samo oni koji se pojavljuju bez rupa kroz godine.
[ anon115774 @ 14.06.2017. 09:51 ] @
Ako uzmemo u obzir da se tvoja tabela zove 'artikli' prvo napravis tabelu koja ce da sadrzi sve moguce kombinacije godina i artikala...

Code:

create temporary table if not exists table1 as (
select distinct t1.artikal, t2.godina
from artikli as t1
cross join artikli as t2
)


Onda proveris koji sve zaista postoje odnosno ne postoje...

Code:

create temporary table if not exists table2 as (
select distinct t1.artikal
from table1 as t1
left join artikli as t2
on t1.godina = t2.godina
and t1.artikal = t2.artikal
where t2.godina is null
)


Kada si dobio one koji ne postoje onda uzmes samo one koji postoje...

Code:

select *
from artikli as t1
where t1.artikal not in (select artikal from table2)


Napisao sam ovo sve na brzinu pa javi ako ima nekih problema i gde :)
[ Orome @ 14.06.2017. 10:15 ] @
pazi, mozda sam i na drugi nacin sada prevazisao problem pa mi odgovor i ne treba. Ali zarad odgovora tvoj predlog skripi jer ja treba da znam da li fali unutrasnja godina (2016 u primeru artikla 41) jer mi samo to zadovoljava uslov da ga ne prikazem. Ako je situacija kao kod artikla 50 iz primera njega ne treba da eliminisem iako ne postoji u 2015 godini. ja ne umem nedvosmisleno ni da objasnim problem ne zato sto sam nepismen nego je specifican uslov u pitanju.
[ jablan @ 14.06.2017. 10:21 ] @
Pod pretpostavkom da ti je (godina, artikl) unique, možeš početi od nečega ovakvog:

Code:

select artikal, max(godina) as max_godina
from prodaja
group by artikal
having count(*) = max(godina) - min(godina) + 1;


pa onda to koristiti kao unutrašnji upit ili view za dalje.

Može i JOIN-ovima kako je informer krenuo, ali malo je teže.
[ dusans @ 14.06.2017. 10:25 ] @
@Informer

Ovo je u principu OK, pronalazi sve artikle koji se pojavljuju u svim godinama.
Dakle, ako se negde pojavi rupa - taj artikal neće biti u rezultatima.

Međutim, koliko sam ja shvatio - početak nije rupa i to pravi dodatni problem:
Code:

Godine: 2015, 2016, 2017, 2018, 2019, 2020

A se pojavljuje u: 2019, 2020
B se pojavljuje u: 2020
C se pojavljuje u: 2018
D se pojavljuje u: 2015, 2016, 2017, 2018, 2019, 2020
E se pojavljuje u: 2017, 2018, 2019

A, B, D bi trebali da budu u rezultatima. C, E ne bi smeli.

@Orome

Uradi join na jablanov upit po artikal = artikal i max_godina = globalna_max_godina i to je to.

[Ovu poruku je menjao dusans dana 14.06.2017. u 11:39 GMT+1]
[ jablan @ 14.06.2017. 11:00 ] @
Traženje artikala sa rupama uz pomoć JOIN-ova (bez potrebe za tabelom sa godinama):

Code:

select * from prodaja p1
left join prodaja p2 on p1.artikal = p2.artikal and p1.godina = p2.godina + 1
left join prodaja p3 on p1.artikal = p3.artikal and p3.godina < p1.godina
left join prodaja p4 on p1.artikal = p4.artikal and p4.godina = p3.godina + 1
where p2.artikal IS NOT NULL and p4.artikal IS NULL;


jbg komplikovano je.
[ anon115774 @ 14.06.2017. 11:27 ] @
Ok, nisam shvatio da se rupom podrazumva samo kad je vec bio tu pa ga sad nema... moja greska.