Forum » Programiranje » [SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeli
[SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeli
mobil123 ::
Zivjo.
Sam se mučim že par ur, pa mi ne uspe ugotoviti tako preprostega vprašanja. Torej... imam stolpec v tabeli npr:
2
2
4
6
8
9
2
6
28
1
.
.
.
poiskati pa moram številko, ki se največkrat ponovi, ter jo izpisati. Stvar zgleda izjemno preprosta, vendar mi takega ukaza ne uspe sestaviti. Prosil bi koga, če mi lahko pomaga.
Hvala.
PS: Opravičujem se ker sem temo vpisal pod pomoč in nasveti, vendar nisem vedel ali spada pod programska oprema, ali programiranje...
Sam se mučim že par ur, pa mi ne uspe ugotoviti tako preprostega vprašanja. Torej... imam stolpec v tabeli npr:
2
2
4
6
8
9
2
6
28
1
.
.
.
poiskati pa moram številko, ki se največkrat ponovi, ter jo izpisati. Stvar zgleda izjemno preprosta, vendar mi takega ukaza ne uspe sestaviti. Prosil bi koga, če mi lahko pomaga.
Hvala.
PS: Opravičujem se ker sem temo vpisal pod pomoč in nasveti, vendar nisem vedel ali spada pod programska oprema, ali programiranje...
- premaknil iz Pomoč in nasveti: gkovac ()
mjakop ::
Sicer nevem ali dela to v PostgreSQL ampak vseeno. Meni vrže prav v Mysql.
SELECT a FROM `test` WHERE a=(SELECT a FROM test GROUP BY `a` ORDER BY COUNT(`a`) DESC Limit 1 ) Limit 1;
Mogoče se da celo bolj elegantno rešit.
SELECT a FROM `test` WHERE a=(SELECT a FROM test GROUP BY `a` ORDER BY COUNT(`a`) DESC Limit 1 ) Limit 1;
Mogoče se da celo bolj elegantno rešit.
manaay ::
Ce ves katere stevilke se pojavljajo v stolpcu in je le teh malo (recimo 100) potem za vsako stevilko naredi "select count(*) from tabela where stolpec=stevilka".
Ce imas veliko razlicnih stevil v stolpcu potem naredi "select stolpec from tabela" in jih v programu prestej.
Tako bi jaz naredil.. mogoce je se kaj bolj preprostega in hitrejsega. Dvomim, da se da zadevo naredit samo za SQLjem. Mogoce v Pl/SQLu ce ga znas.
lp, Miha
Ce imas veliko razlicnih stevil v stolpcu potem naredi "select stolpec from tabela" in jih v programu prestej.
Tako bi jaz naredil.. mogoce je se kaj bolj preprostega in hitrejsega. Dvomim, da se da zadevo naredit samo za SQLjem. Mogoce v Pl/SQLu ce ga znas.
lp, Miha
mobil123 ::
hvala za odgovora, se posebej pa mjakop-u . Stvar mi je zgledala čisto preprosta, pa sploh ni... A bi lahko ta isti ukaz sluzil tudi za iskanje grup, kot npr da bi izpisal vse ki se ponovijo vec kot enkrat?
Zgodovina sprememb…
- spremenilo: mobil123 ()
mobil123 ::
Točno to sem poskušal pa mi ne prime.. Imam stolpec:
[2; 5; 3; 11; 14; 18; 19; 21; 2; 2; 2; 11; 21]^T
pa mi ispiše samo 2.
[2; 5; 3; 11; 14; 18; 19; 21; 2; 2; 2; 11; 21]^T
pa mi ispiše samo 2.
Zgodovina sprememb…
- spremenilo: mobil123 ()
darkolord ::
SELECT stolpec FROM tabela GROUP BY stolpec HAVING count(*) > 1 ORDER BY COUNT(*) DESC
Zgodovina sprememb…
- spremenilo: darkolord ()
vojko20 ::
Točno to sem poskušal pa mi ne prime.. Imam stolpec:
[2; 5; 3; 11; 14; 18; 19; 21; 2; 2; 2; 11; 21]^T
pa mi ispiše samo 2.
Izpise ti samo 2 zaradi unega LIMIT 1 pomeni da ti bo samo enega izpisal, torej tistega, ki se je največkrat ponovil in to je 2. Dej un LIMIT 1 stran pa ti bo izpisal vse po vrsti od tistega, ki jih je največ do tistega, katerih je najmanj.
mobil123 ::
Hvala za odgovore,saj se tega sam nebi zlepa spomnil.. Prosil bi samo se ce bi bilo mozno da mi kdo pove kaj delam narobe pri tem, ker se mi je spet malo zataknilo:
select vrsta_predmeta,id_predmeta from predmet where (SELECT id_predmet FROM nakup GROUP BY id_predmet HAVING count(*)>1 ORDER BY COUNT(*) )=id_predmeta
Napaka, ki mi jo napise je: More than one row returned by a subquery used as an expression
Pravilno deluje ce napisem count(*)>2, saj se tolikokrat ponovi samo en predmet.. Ce pa dam 1 pa napise zgornjo napako.
imam prvo tabelo predmet s stolpci vrsta_predmeta in id_predmet ki je pk
ter drugo tabelo nakup s stolpcem id_predmeta
Ideja je, da bi mi izpisalo tiste vrste predmeta, ki se v tabeli nakup pojavijo vec kot 1x. id_predmeta pa je v obeh isti,saj je v tabeli predmet PK. Se pravi da vzame vrednost iz tabele nakup (tista ki se pojavi vec kot 1x), jo primerja s stolpcem id_predmeta tabele predmet, ter izpise tiste vrste , ki se v id_predmet tabele nakup pojavijo veckrat.
select vrsta_predmeta,id_predmeta from predmet where (SELECT id_predmet FROM nakup GROUP BY id_predmet HAVING count(*)>1 ORDER BY COUNT(*) )=id_predmeta
Napaka, ki mi jo napise je: More than one row returned by a subquery used as an expression
Pravilno deluje ce napisem count(*)>2, saj se tolikokrat ponovi samo en predmet.. Ce pa dam 1 pa napise zgornjo napako.
imam prvo tabelo predmet s stolpci vrsta_predmeta in id_predmet ki je pk
ter drugo tabelo nakup s stolpcem id_predmeta
Ideja je, da bi mi izpisalo tiste vrste predmeta, ki se v tabeli nakup pojavijo vec kot 1x. id_predmeta pa je v obeh isti,saj je v tabeli predmet PK. Se pravi da vzame vrednost iz tabele nakup (tista ki se pojavi vec kot 1x), jo primerja s stolpcem id_predmeta tabele predmet, ter izpise tiste vrste , ki se v id_predmet tabele nakup pojavijo veckrat.
darkolord ::
Ehm, ja tale stavk ne dela, ker ti podstavek vrne več kot eno vrednost...
probi recim tkole:
SELECT p.vrsta_predmeta, n.id_predmet FROM predmet p, nakup n WHERE n.id_predmet = p.id_predmeta GROUP BY p.vrsta_predmeta, n.id_predmet HAVING count(n.id_predmet)>1 ORDER BY COUNT(n.id_predmet)
probi recim tkole:
SELECT p.vrsta_predmeta, n.id_predmet FROM predmet p, nakup n WHERE n.id_predmet = p.id_predmeta GROUP BY p.vrsta_predmeta, n.id_predmet HAVING count(n.id_predmet)>1 ORDER BY COUNT(n.id_predmet)
Zgodovina sprememb…
- spremenilo: darkolord ()
mobil123 ::
Thanks darkolord.. se malo sem se poigral s temi ukazi,pa odkril se nekaj uporabnih stvari..
mobil123 ::
Živjo.
Sem že čisto pri koncu, edino kar mi ne uspe še pogruntat sta ti dve malenkosti:
1. če napisem:
select vrsta_predmeta from predmet, nakup
where predmet.id_predmeta=nakup_idpredmet
dela kot je treba. Se pravi, da primerja oba stolpca, ter izpiše tiste, ki so enaki. Če pa dam vmes (!=) ali (not like) pa mi izpiše večkrat vse. predmet.id_predmeta je dolg 21 vrstic, nakup_idpredmet pa 12, vendar se nekatere številke tu ponovijo.
2. če napišem:
select sum(stolpec_x) from tabela1 / select sum(stolpec_y) from tabela2
mi javi napako...
Ne uspe mi ugotovit kako bi seštel vse številke v prvem stolpcu, ter v drugem stolpcu in nato seštevek prvega stolpca delil s seštevkom drugega stolpca...
Sem že čisto pri koncu, edino kar mi ne uspe še pogruntat sta ti dve malenkosti:
1. če napisem:
select vrsta_predmeta from predmet, nakup
where predmet.id_predmeta=nakup_idpredmet
dela kot je treba. Se pravi, da primerja oba stolpca, ter izpiše tiste, ki so enaki. Če pa dam vmes (!=) ali (not like) pa mi izpiše večkrat vse. predmet.id_predmeta je dolg 21 vrstic, nakup_idpredmet pa 12, vendar se nekatere številke tu ponovijo.
2. če napišem:
select sum(stolpec_x) from tabela1 / select sum(stolpec_y) from tabela2
mi javi napako...
Ne uspe mi ugotovit kako bi seštel vse številke v prvem stolpcu, ter v drugem stolpcu in nato seštevek prvega stolpca delil s seštevkom drugega stolpca...
Zgodovina sprememb…
- spremenilo: mobil123 ()
zdravc ::
Poskusi gornji select od darkolor-ja vendar malo spremenjen :
SELECT p.vrsta_predmeta, n.id_predmet FROM predmet p, nakup n WHERE n.id_predmet = p.id_predmeta GROUP BY p.vrsta_predmeta, n.id_predmet
HAVING count(n.id_predmet) = max(count(n.id_predmet));
Za to varianto sicer nisem preprican, preizkusit pa tudi ne morem, ker doma nimam baze.
Sporoci, ce gre.
1.
Ce das logicen operator razlicno, potem select vrne zmnozek zapisov iz obeh tabel oz. kartezicni produkt,
ker za vsak zapis iz prve tabele izpise vse zapise iz druge tabele, ki niso enaki zapisu iz prve tabele.
2.
Za sestevanje dveh sum iz razlicnih tabel pa uporabi subselect :
select
((select sum(stolpec_x) from tabela1) / (select sum(stolpec_y) from tabela2))
from dual;
SELECT p.vrsta_predmeta, n.id_predmet FROM predmet p, nakup n WHERE n.id_predmet = p.id_predmeta GROUP BY p.vrsta_predmeta, n.id_predmet
HAVING count(n.id_predmet) = max(count(n.id_predmet));
Za to varianto sicer nisem preprican, preizkusit pa tudi ne morem, ker doma nimam baze.
Sporoci, ce gre.
1.
Ce das logicen operator razlicno, potem select vrne zmnozek zapisov iz obeh tabel oz. kartezicni produkt,
ker za vsak zapis iz prve tabele izpise vse zapise iz druge tabele, ki niso enaki zapisu iz prve tabele.
2.
Za sestevanje dveh sum iz razlicnih tabel pa uporabi subselect :
select
((select sum(stolpec_x) from tabela1) / (select sum(stolpec_y) from tabela2))
from dual;
kdor zna pa žih
miha22 ::
prav imaš:
vrstni red:
1 select
2 from
3 where
4 group by
5 having
6 order by
od teh sta obvezna samo select in from.
vrstni red:
1 select
2 from
3 where
4 group by
5 having
6 order by
od teh sta obvezna samo select in from.
Zgodovina sprememb…
- spremenil: miha22 ()
mobil123 ::
Zivjo.
Per dni sem bil brez interneta, pa nisem mogel prej odgovorit.. No ma vglavnem...rad bi se samo se enkrat zahvalil vsem, ki ste mi pomagali..
Per dni sem bil brez interneta, pa nisem mogel prej odgovorit.. No ma vglavnem...rad bi se samo se enkrat zahvalil vsem, ki ste mi pomagali..
Cvele2011 ::
Pozdravljeni,
Jaz pa imam vprašanje kako naj dobim vse datume ki se pojavijo > 2 krat
npr.
2011-01-04 11:33:19.000
2011-01-04 19:08:46.000
2011-01-05 11:41:00.000
2011-01-05 19:02:23.000
2011-01-06 07:44:55.000
2011-01-06 12:00:08.000
2011-01-06 15:50:42.000
2011-01-06 19:01:43.000
..
Rezultat mora biti :
2011-01-06 07:44:55.000
2011-01-06 12:00:08.000
2011-01-06 15:50:42.000
2011-01-06 19:01:43.000
L.p.
Jaz pa imam vprašanje kako naj dobim vse datume ki se pojavijo > 2 krat
npr.
2011-01-04 11:33:19.000
2011-01-04 19:08:46.000
2011-01-05 11:41:00.000
2011-01-05 19:02:23.000
2011-01-06 07:44:55.000
2011-01-06 12:00:08.000
2011-01-06 15:50:42.000
2011-01-06 19:01:43.000
..
Rezultat mora biti :
2011-01-06 07:44:55.000
2011-01-06 12:00:08.000
2011-01-06 15:50:42.000
2011-01-06 19:01:43.000
L.p.
zavajon ::
Za Oracle:
select * from tabela
where trunc(datum) in (select trunc(datum) from tabela group by trunc(datum) having count(*) > 2)
Za MSSQL:
select * from tabela
where convert(varchar,datum,104) in (select convert(varchar,datum,104) from tabela group by convert(varchar,datum,104) having count(*) > 2)
Za druge baze preveri, kako je s funkcijo za truncatanje datumov.
select * from tabela
where trunc(datum) in (select trunc(datum) from tabela group by trunc(datum) having count(*) > 2)
Za MSSQL:
select * from tabela
where convert(varchar,datum,104) in (select convert(varchar,datum,104) from tabela group by convert(varchar,datum,104) having count(*) > 2)
Za druge baze preveri, kako je s funkcijo za truncatanje datumov.
Cvele2011 ::
Zdaj sem probal ta stavek in rezultat dobim vse..!?
Pr.
select * from PRIJAVE where (convert(varchar,DOGODEK,104) in (select convert(varchar,DOGODEK,104) from PRIJAVE group by convert(varchar,DOGODEK,104) having count(*) > 2)) and ID='00116'
00116 2011-01-03 07:34:20.000
00116 2011-01-03 11:59:59.000
00116 2011-01-03 19:20:06.000
00116 2011-01-04 07:34:43.000
00116 2011-01-04 12:01:51.000
00116 2011-01-04 15:45:39.000
00116 2011-01-04 19:20:59.000
00116 2011-01-05 12:48:32.000
00116 2011-01-05 19:20:38.000
00116 2011-01-06 12:48:39.000
00116 2011-01-06 19:17:25.000
00116 2011-01-07 09:46:32.000
00116 2011-01-07 17:01:48.000
00116 2011-01-08 07:56:45.000
00116 2011-01-08 15:39:55.000
00116 2011-01-10 07:48:04.000
00116 2011-01-10 13:11:00.000
00116 2011-01-11 07:38:31.000
00116 2011-01-11 12:04:13.000
00116 2011-01-11 15:49:55.000
00116 2011-01-11 19:09:17.000
Rezultat:
ENAKI!?
Pr.
select * from PRIJAVE where (convert(varchar,DOGODEK,104) in (select convert(varchar,DOGODEK,104) from PRIJAVE group by convert(varchar,DOGODEK,104) having count(*) > 2)) and ID='00116'
00116 2011-01-03 07:34:20.000
00116 2011-01-03 11:59:59.000
00116 2011-01-03 19:20:06.000
00116 2011-01-04 07:34:43.000
00116 2011-01-04 12:01:51.000
00116 2011-01-04 15:45:39.000
00116 2011-01-04 19:20:59.000
00116 2011-01-05 12:48:32.000
00116 2011-01-05 19:20:38.000
00116 2011-01-06 12:48:39.000
00116 2011-01-06 19:17:25.000
00116 2011-01-07 09:46:32.000
00116 2011-01-07 17:01:48.000
00116 2011-01-08 07:56:45.000
00116 2011-01-08 15:39:55.000
00116 2011-01-10 07:48:04.000
00116 2011-01-10 13:11:00.000
00116 2011-01-11 07:38:31.000
00116 2011-01-11 12:04:13.000
00116 2011-01-11 15:49:55.000
00116 2011-01-11 19:09:17.000
Rezultat:
ENAKI!?
zavajon ::
Morda ti convert(varchar,DOGODEK,104) ne vrne samo datuma z uro 00:00:00.
Preveri za bazo, v kateri delaš, kako se iz datuma odreže ure.
Ker ti očitno rabiš izpis s pogojem števila recordov na isti datum.
Za začetek naredi to:
select DOGODEK, convert(varchar,DOGODEK,104) datum from PRIJAVE,
pa vidiš, če ti prav konvertira.
Pa je polje DOGODEK res datumskega tipa?
Če je varchar, moraš uporabiti substring().
Preveri za bazo, v kateri delaš, kako se iz datuma odreže ure.
Ker ti očitno rabiš izpis s pogojem števila recordov na isti datum.
Za začetek naredi to:
select DOGODEK, convert(varchar,DOGODEK,104) datum from PRIJAVE,
pa vidiš, če ti prav konvertira.
Pa je polje DOGODEK res datumskega tipa?
Če je varchar, moraš uporabiti substring().
Cvele2011 ::
2011-01-03 07:34:20.000 - 03.01.2011
2011-01-03 11:59:59.000 - 03.01.2011
2011-01-03 19:20:06.000 - 03.01.2011
to dobim vun tak da je to ok...!?
2011-01-03 11:59:59.000 - 03.01.2011
2011-01-03 19:20:06.000 - 03.01.2011
to dobim vun tak da je to ok...!?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | mySQL izpis many-to-many to matrixOddelek: Izdelava spletišč | 890 (651) | klemenSLO |
» | Matura 2 predmet E-redovalnicaOddelek: Programiranje | 1430 (1064) | FiR3F0X |
» | Pridobitev podatkov in sortiranjeOddelek: Programiranje | 920 (741) | Spura |
» | namizna aplikacija v javiOddelek: Programiranje | 1877 (1390) | urosz |
» | SQL poizvedbaOddelek: Programiranje | 2157 (1667) | borchi |