Novo

Forum kao aplikacija na telefonu

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

  • 27 odgovora
  • 8.246 pregleda

Najnovija ↓

distinct count po uslovu 12.04.2016. u 11:53 · pre 128 meseci #1
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
Re: distinct count po uslovu 12.04.2016. u 11:59 · pre 128 meseci #2
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...
Re: distinct count po uslovu 12.04.2016. u 12:12 · pre 128 meseci #3
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)
Re: distinct count po uslovu 12.04.2016. u 12:22 · pre 128 meseci #4
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
 
Re: distinct count po uslovu 12.04.2016. u 12:27 · pre 128 meseci
izmenjeno 1 put, poslednji put djoka_l 12.04.2016. u 12:37
  1. djoka_l12.04.2016. u 12:37zapis iz teksta poruke
#5
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)
 
Re: distinct count po uslovu 12.04.2016. u 12:42 · pre 128 meseci #6
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)

 


Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: distinct count po uslovu 12.04.2016. u 12:44 · pre 128 meseci #7
A može i kako je bogdan napisao :)

Radi ako nema negativnih vrednosti u polju flag
Re: distinct count po uslovu 12.04.2016. u 12:44 · pre 128 meseci #8
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
 
Re: distinct count po uslovu 12.04.2016. u 12:52 · pre 128 meseci #9
Bogdane, šta propuštam sa ovim MAX(rj), nije mi jasan?
Re: distinct count po uslovu 12.04.2016. u 13:09 · pre 128 meseci #10
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
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Sviđa mi se1
Re: distinct count po uslovu 12.04.2016. u 13:17 · pre 128 meseci
izmenjeno 1 put, poslednji put jablan 12.04.2016. u 13:30
  1. jablan12.04.2016. u 13:30zapis iz teksta poruke
#11
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
Sviđa mi se1
Re: distinct count po uslovu 12.04.2016. u 13:19 · pre 128 meseci #12
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
 
Re: distinct count po uslovu 12.04.2016. u 13:26 · pre 128 meseci #13
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?
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: distinct count po uslovu 12.04.2016. u 13:47 · pre 128 meseci #15
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.
Re: distinct count po uslovu 12.04.2016. u 14:24 · pre 128 meseci #17
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.
Re: distinct count po uslovu 12.04.2016. u 14:28 · pre 128 meseci #18
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?
Re: distinct count po uslovu 12.04.2016. u 14:29 · pre 128 meseci #19
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"
Re: distinct count po uslovu 12.04.2016. u 14:41 · pre 128 meseci #20
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
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme