» »

[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...

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.

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

manaay ::

no zgleda da se da tud samo z SQL.. se morm se kaj naucit :)

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 ()

Reso ::

SELECT stolpec FROM tabela GROUP BY stolpec ORDER BY COUNT(*) DESC LIMIT 1

Problem rešen.

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.

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.

darkolord ::

moj stavek zgoraj izpiše vse, ki se ponovijo več kot enkrat

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.

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)

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...

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;
kdor zna pa žih

darkolord ::

pomoje je sicer HAVING pred ORDER BY

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.

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..

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.

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.

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!?

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().

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...!?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

mySQL izpis many-to-many to matrix

Oddelek: Izdelava spletišč
7823 (584) klemenSLO
»

Matura 2 predmet E-redovalnica

Oddelek: Programiranje
101358 (992) FiR3F0X
»

Pridobitev podatkov in sortiranje

Oddelek: Programiranje
9862 (683) Spura
»

namizna aplikacija v javi

Oddelek: Programiranje
371756 (1269) urosz
»

SQL poizvedba

Oddelek: Programiranje
152084 (1594) borchi

Več podobnih tem