select count(distinct a,b,c,d) from mytable;
select count(distinct concat(a,"-",b),concat(c,"-",d)) from mytable;
Poiché "-" non appare mai nei campi a, b, c, d, le 2 query sopra riportate dovrebbero restituire lo stesso risultato. Ho ragione ?
In realtà non è così, la differenza è di 4 righe su ~ 60M e non riesco a capire come sia possibile
Qualche idea o esempio? Grazie
risposte:
1 per risposta № 1In primo luogo, presumo che tu stia utilizzando MySQL, perché questo è l'unico database dei tuoi tag originali in cui la tua sintassi verrebbe accettata.
In secondo luogo, questo non risponde direttamente alla tua domanda. Dati i tuoi tipi ed espressioni, non vedo come puoi ottenere risultati diversi. Tuttavia, costrutti molto simili possono produrre risultati diversi.
È molto importante notare questo NULL
non è il colpevole. Se qualsiasi argomento è NULL
Per entrambi COUNT(DISTINCT)
o CONCAT()
, quindi il risultato è NULL
-- e NULL
s non vengono contati
Tuttavia, gli spazi alla fine delle stringhe possono essere un problema. Considera i risultati di questa query:
select count(distinct x, y),
count(distinct concat(x, "-", y)),
count(distinct concat(y, "-", x))
from (select 1 as x, "a" as y union all
select 1, "a " union all
select 1, NULL
) a
Mi aspetto che il secondo e il terzo argomento restituiscano la stessa cosa. Ma gli spazi alla fine della stringa causano differenze. COUNT(DISTINCT)
li ignora. Però, CONCAT()
li incorpori nella stringa. Quindi, i ritorni di cui sopra
1 1 2
E i due valori sono diversi.
In altre parole, due valori potrebbero non essere esattamente uguali, ma COUNT(DISTINCT)
potrebbe considerarli uguali. Gli spazi sono un esempio. Le contestazioni sono un altro potenziale colpevole.
0 per risposta № 2
Prendi esempio di dati di esempio
A B C D
1 2 3 4
5 6 7 8
1 2 5 7
1 2 5 7
1 3 3 4
1 3 3 4
quindi conta (distinto (a, b, c, d)) = 4
A B C D
1 2 3 4
5 6 7 8
1 2 5 7
1 3 3 4
e contare (distinto (a, -, b), distinto (c, -, d)) = 3
dist (a,-,b) dist (c,-,d)
1 2 3 4
5 6 7 8
1 3 5 7