2017-08-04 2 views
3

Il existe un ensemble de données supposé être un mappage 1-à-1. Cependant, il y a, par exemple,Comment trouver une entrée un-à-plusieurs

userId, deviceId 
aaa, 12345 
bbb, 22398 
ccc, 43284 

un cas où l'on a beaucoup deviceId userId.

userId, deviceId 
ddd, 12094 
eee, 12094 
fff, 12094 
ggg, 459834 
hhh, 459834 
iii, 459834 
jjj, 459834 

Qu'est-ce que SQL peut répertorier uniquement ces entrées un-à-plusieurs? Imaginez, il y a beaucoup d'entrées un-à-plusieurs. Je n'ai pas besoin d'une entrée 1-à-1 dans le résultat. Alors, ce que je veux voir comme résultat est quelque chose comme,

deviceId, _cnt 
12094, 3 
459834, 4 
+1

Vous pouvez utiliser SELECT ' deviceId, COUNT (*) AS _cnt FROM mytable GROUPE BY IDUTILISATEUR COMPTE (*)> 1' t o obtenir ces valeurs 'deviceId' liées à des entrées un-à-plusieurs. –

Répondre

0

Salut, vous pouvez COUNT puis filtrer pour ceux qui ont un nombre supérieur à 1:

SELECT deviceId 
     , COUNT(DISTINCT userId) AS uct 
     , COUNT(userId) AS ct 
    FROM table 
GROUP BY deviceId 
HAVING ct > 1 
    AND uct > 1 
+1

Comment fonctionne cette requête s'il y a plusieurs entrées 1 à 1. Par exemple, aaa, 12345, aaa, 12345, aaa, 12345. Montre-t-il 12345, 3? Je veux les exclure. –

+1

oui ceux qui seraient inclus, je vais éditer ma réponse – RealCheeseLord

+0

Cette requête va filtrer toutes les entrées mappées 1-à-1. Donc, il ne montrera pas les entrées similaires aaaa . – smau

2

Il est conseillé d'utiliser nom de la colonne au lieu de count (*). Cela améliorera également les performances dans le cas d'un grand ensemble de données.

SELECT deviceId, 
COUNT(userId) AS user_count 
FROM table 
GROUP BY deviceId 
HAVING COUNT(userId)> 1 
+0

Vous ne pouvez pas utiliser une colonne alias dans une clause having. –

+0

Droit, a corrigé la réponse. Merci. – smau

1

Un simple compte le fait:

select deviceId, count(*) _cnt 
from mytable 
group by 1 
having count(*) > 1 

Pour répertorier toutes les entrées qui ne sont pas 1-1:

select userId, deviceId 
from mytable 
where deviceId in (
    select deviceId 
    from mytable 
    group by 1 
    having count(*) > 1 
) 

Ou

select distinct a.userId, b.deviceId 
from mytable a 
join mytable b on b.deviceId = a.deviceId 
    and b.userId != a.deviceId