Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

distinct count po uslovu

[es] :: MySQL :: distinct count po uslovu

Strane: 1 2

[ Pregleda: 5583 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Orome
programer

Član broj: 273201
Poruke: 115
193.17.204.*



+1 Profil

icon distinct count po uslovu12.04.2016. u 10:53 - pre 97 meseci
imam tabelu kao ovu dole, ono sto mi treba je count(distinct id) samo kod onih 'id' gde je flag nula. znaci ispunjava uslov dok 1 i 2 a ne ispunjava uslov dok 3 i 4. 3 ne ispunjava jer ima jedan red sa 0 i jedan sa 1. 4 ispunjava jer ima samo jedan red sa nulom. znaci treba mi da izbrojim id-jeve tamo gde su svi redovi u tom id-u nula. ne brojim redove nego cele id-jeve.

rj - id - flag
1 - 1 - 0
1 - 1 - 0
1 - 2 - 0
1 - 3 - 0
1 - 3 - 1
1 - 4 - 1
2 - 1 - 0
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 10:59 - pre 97 meseci
Citat:

... 4 ispunjava jer ima samo jedan red sa nulom

Ja vidim da 4 ima jedan red sa jedinicom a ne nulom.

U principu je sve jasno ali ne i rezultat, napiši primer izlaza za ove podatke...
 
Odgovor na temu

Orome
programer

Član broj: 273201
Poruke: 115
193.17.204.*



+1 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:12 - pre 97 meseci
izvini, to je greska. 4 je trebala biti sa nulom. medjutim posto je sa jedinicom rezultat je sledeci :

rj - count_id
1 - 2 (id 1 i 2)
2 - 1 (id 1)
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:22 - pre 97 meseci
Evo ti rešenja u T-SQLu pošto ne radim MySql:
Code (sql):

SELECT rj, COUNT(id) AS count_id
FROM
(
     SELECT rj, id,
             SUM(CASE WHEN flag = 0 THEN 1 ELSE 0 END) AS C0,
             SUM(CASE WHEN flag = 0 THEN 0 ELSE 1 END) AS CX
     FROM rec GROUP BY rj, id
) AS main
WHERE (C0 > 0) AND (CX = 0)
GROUP BY rj
 


U MySql-u umesto CASE koristi IF, ne znam sintaksu, nešto tipa:
Code (sql):

SUM(IF(flag = 0, 1, 0)) AS C0,
SUM(IF(flag = 0, 0, 1)) AS CX
 
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:27 - pre 97 meseci
sledeći upit izbacuje id za koji ne postoji ni jedan red sa flagom različitim od nule

Code (sql):

SELECT DISTINCT id
FROM ttt a
WHERE NOT EXISTS (
   SELECT b.id
   FROM ttt b
   WHERE b.id = a.id
   AND flag != 0)
 


a ovaj njihov broj

Code (sql):

SELECT COUNT(*)
FROM (
  SELECT DISTINCT id
  FROM ttt a
  WHERE NOT EXISTS (
     SELECT b.id
     FROM ttt b
     WHERE b.id = a.id
     AND flag != 0)
)
 


Prvi upit radi dobro ako postoji indeks nad id. Ako ne postoji, onda sledeći upit može da radi brže:
Code (sql):

SELECT DISTINCT id
FROM ttt a
WHERE a.id NOT IN (
   SELECT DISTINCT b.id
   FROM ttt b
   WHERE flag != 0)
 



[Ovu poruku je menjao djoka_l dana 12.04.2016. u 12:37 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:42 - pre 97 meseci
Code (sql):


mysql> CREATE TABLE t1 ( rj INT,  id INT, flag INT)engine=myisam;
Query OK, 0 ROWS affected (0.01 sec)

mysql> INSERT INTO t1 VALUES (1,1,0), (1,1,0), (1,2,0), (1,3,0), (1,3,1), (1,4,1), (2,1,0);
Query OK, 7 ROWS affected (0.02 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> SELECT MAX(rj), id, COUNT(*) FROM t1 GROUP BY id HAVING SUM(flag) = 0;
+---------+------+----------+
| MAX(rj) | id   | COUNT(*) |
+---------+------+----------+
|       2 |    1 |        3 |
|       1 |    2 |        1 |
+---------+------+----------+
2 ROWS IN SET (0.00 sec)

 



 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:44 - pre 97 meseci
A može i kako je bogdan napisao

Radi ako nema negativnih vrednosti u polju flag
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:44 - pre 97 meseci
Code (sql):

SELECT rj, COUNT(id) AS count_id
FROM
(
     SELECT rj, id FROM rec
     GROUP BY rj, id HAVING SUM(flag) = 0
) AS main GROUP BY rj
 
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 11:52 - pre 97 meseci
Bogdane, šta propuštam sa ovim MAX(rj), nije mi jasan?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:09 - pre 97 meseci
malo je nejasno covek napisao sta hoce pa ja sad nagadjam sta mu je cilj, ono kako je napisao to mu dodje taj moj upit eventualno umesto HAVING SUM(flag) = 0; da stavi HAVING SUM(ABS(flag)) = 0; ako ima i negativne vrednosti da upit uvek bude validan ..

MAX(rj) je zbog SQL standarda, ne mozes da imas u select spisku vrednost koja nije jednoznacna, posto u tom upitu imas GROUP BY id to znaci da jedino ID ima jednoznacnu vrednost i naravno rezultati agregacionih funkcija ali RJ ne moze da bude jednoznacan, to sto u njegovom slucaju jeste je zato sto je tako ubacio datu ali mogao je da upise datu i drugacije ... primer, da je umesto

(1,1,0), (1,1,0), (1,2,0), (1,3,0), (1,3,1), (1,4,1), (2,1,0);

imao

(5,1,0), (1,1,0), (1,2,0), (1,3,0), (1,3,1), (1,4,1), (2,1,0);

koji RJ u tom slucaju treba da mu vratis za id 1? 5 ili 1, stare verzije mysql-a ne postuju standard po tom pitanju i vratice ti nekad 5 nekad 1 (nikad ne znas koji) ali nece prijaviti gresku, novi mysql po defaultu vraca gresku da je upit nevalidan ... te posto je njemu ocigledno svejedno koji RJ ce da vrati ja sam stavio MAX() da bi imao validan upit, moze da bude i min i avg i sta god vec mu treba .... dodatno sto mysql ne podrzava windowed funkcije ali da ne idemo sad na tu stranu....

e sad, sve to ako sam ja skontao sta je orome hteo posto mu simplifikacija problema nije bila bas 100% uspesna :D nadam se da ce uspeti da iskoristi odgovore, ako ne, morace da da malo tacniji opis problema da bi dobio i tacniji odgovor
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:17 - pre 97 meseci
Code:

mysql> select a.rj, count(distinct a.id) from  tabela as a
       left join tabela as b on a.id = b.id and b.flag <> 0
       where b.id is null
       group by a.rj;
+------+----------------------+
| rj   | count(distinct a.id) |
+------+----------------------+
|    1 |                    2 |
|    2 |                    1 |
+------+----------------------+
2 rows in set (0.01 sec)


BTW ne savetujem vam da se oslanjate na hakove sa SUM().

//edit: indent

[Ovu poruku je menjao jablan dana 12.04.2016. u 13:30 GMT+1]
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:19 - pre 97 meseci
Objasnio je output u trećem post-u, rezultati su grupisani po rj.
http://www.elitesecurity.org/t490232-0#3668729
Code:

rj - count_id
1 - 2 (id 1 i 2)
2 - 1 (id 1) 


Kopka me da li takav output može da se dobije prostije od ovoga:
http://www.elitesecurity.org/t490232-0#3668747
Code (sql):

SELECT rj, COUNT(id) AS count_id
FROM
(
     SELECT rj, id FROM rec
     GROUP BY rj, id HAVING SUM(flag) = 0
) AS main GROUP BY rj
 
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:26 - pre 97 meseci
al ga je objasio bas je sve jasno ?!?!?!

izvini, to je greska. 4 je trebala biti sa nulom. medjutim posto je sa jedinicom rezultat je sledeci :

rj - count_id
1 - 2 (id 1 i 2)
2 - 1 (id 1)


sta je "2 (id 1 i 2)" - koji je to "rezultat" ..
po cemu je RJ unique vezan za ID ? sta ako je data

(5,1,0), (1,1,0), (1,2,0), (1,3,0), (1,3,1), (1,4,1), (2,1,0)

kako onda treba da izgleda izlaz?

posto to sto on ima 1:1 unutar tabele izmedju RJ i ID jel to pravilo ili? cemu onda sluzi ID ako je RJ u 1:1 sa ID ?

tvoj upit ce da vrati

Code:

mysql> SELECT rj, COUNT(id) AS count_id
    -> FROM
    -> (
    ->      SELECT rj, id FROM t1 GROUP BY rj, id HAVING SUM(flag) = 0
    -> ) AS main GROUP BY rj
    ->  ;
+------+----------+
| rj   | count_id |
+------+----------+
|    1 |        2 |
|    2 |        1 |
|    5 |        1 |
+------+----------+


jel to hteo?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:38 - pre 97 meseci
(btw sad citam ovaj moj post deluje kao da se svadjam - ne svadjam se!!! nego mi i dalje nije jasno sta mu je zahtev)
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:47 - pre 97 meseci
Da definitivno je hteo takav output.
Jedino gde mi još uvek nije jasan koji je scope u kom gleda da li su svi flagovi nula za neki id.
Da li je taj scope cela tabela ili samo u okviru posmatrane rj.
Napisao je kao da je u pitanju cela tabela ali ne mora da znači pošto je bio dosta nedorečen u prvom postu.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 12:51 - pre 97 meseci
sta znam, ja nikako ne vidim iz njegovih postova sta je hteo :D najmanje
da je hteo ovaj zadnji output no mozda bolje da sacekamo njega :D
 
Odgovor na temu

Orome
programer

Član broj: 273201
Poruke: 115
193.17.204.*



+1 Profil

icon Re: distinct count po uslovu12.04.2016. u 13:24 - pre 97 meseci
evo me, dusans je shvatio i dao resenje

Code:

SELECT rj, COUNT(id) AS count_id
FROM
(
     SELECT rj, id,
             SUM(CASE WHEN flag = 0 THEN 1 ELSE 0 END) AS C0,
             SUM(CASE WHEN flag = 0 THEN 0 ELSE 1 END) AS CX
     FROM rec GROUP BY rj, id
) AS main
WHERE (C0 > 0) AND (CX = 0)
GROUP BY rj


hvala na svim odgovorima. sto se tice drugih, djoka_l ne radi ovaj upit.

@bogdan ne znam sta nije jasno, sto se tice ovog dela

rj - count_id
1 - 2 (id 1 i 2)
2 - 1 (id 1)

pod rj 1 ocekivani rezultat je 2 a u zagradi je objasnjenje po id koji id-jevi ispunjavaju uslov. imao sam samo jos da dodam tacan where uslov koji ce proraditi. rj je podatak koji se nalazi u bazi i po hijerarhiji je na vrhu ovog seta. u okviru rj mi treba broj id-jeva koji ispunjavaju uslov.

izvinjavam se zbog nedorecenosti.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: distinct count po uslovu12.04.2016. u 13:28 - pre 97 meseci
id ispunjava uslov ako su sve njegove pojave sa flag=0.
Pošto je nedorečeno, pojasni - da li si mislio na pojave u celoj tabeli ili samo na pojave u posmatranoj rj?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: distinct count po uslovu12.04.2016. u 13:29 - pre 97 meseci
Pa, ja sam odgovorio na tvoj prvi post
Citat:
imam tabelu kao ovu dole, ono sto mi treba je count(distinct id) samo kod onih 'id' gde je flag nula. znaci ispunjava uslov dok 1 i 2 a ne ispunjava uslov dok 3 i 4. 3 ne ispunjava jer ima jedan red sa 0 i jedan sa 1. 4 ispunjava jer ima samo jedan red sa nulom. znaci treba mi da izbrojim id-jeve tamo gde su svi redovi u tom id-u nula. ne brojim redove nego cele id-jeve.


A imao sam problema da shvatim, recimo "znaci ispunjava uslov dok 1 i 2"
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: distinct count po uslovu12.04.2016. u 13:41 - pre 97 meseci
Citat:
Orome:
@bogdan ne znam sta nije jasno



kako nije nejasno :D da si im bar dao neka imena koja imaju smisla :D nije mi jasno kako je samo dusan uspeo da zakljuci iz ovako sturih podataka sta ti treba :D

elem u svakom slucaju ovaj dusanov groupby(groupby) ti dodje to resenje koje najlakse radi verovatno ceo sistem moze drugacije da se optimizuje ali ne sa ovoliko podataka :D
 
Odgovor na temu

[es] :: MySQL :: distinct count po uslovu

Strane: 1 2

[ Pregleda: 5583 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.