2 votes

Comment ne compter que la première occurrence d'une valeur ?

J'ai une table comme celle-ci ;

+----+---------+-------------+
| id | user_id | screenWidth |
+----+---------+-------------+
|  1 |       1 |        1366 |
|  2 |       1 |        1366 |
|  3 |       1 |        1366 |
|  4 |       1 |        1366 |
|  5 |       2 |        1920 |
|  6 |       2 |        1920 |
|  7 |       3 |        1920 |
|  8 |       4 |        1280 |
|  9 |       5 |        1280 |
| 10 |       6 |        1280 |
+----+---------+-------------+

Ainsi que de nombreuses autres données. Ces données pourraient être normalisées si nécessaire ; à l'origine, je ne pensais pas en avoir besoin, mais je devrais peut-être le faire. Quoi qu'il en soit,

Je voudrais une requête qui ne compte les valeurs de screenWidth qu'une seule fois par utilisateur, de sorte que la sortie ressemblerait à :

+-------------+-------+
| screenWidth | count |
+-------------+-------+
|        1366 |     1 |
|        1920 |     2 |
|        1280 |     3 |
+-------------+-------+

Plutôt que de compter 1366 comme 4, cela éviterait que les gros utilisateurs ne faussent les données.

Existe-t-il un moyen d'écrire une requête pour faire cela ?

6voto

oezi Points 27038

Court et simple : utiliser COUNT DISTINCT :

SELECT
  screenWidth,
  COUNT(DISTINCT user_id)
FROM
  mytable
GROUP BY
  screenWidth;

5voto

Vous devez obtenir le nombre DISTINCT d'utilisateurs par largeur d'écran. Voici l'exemple de requête qui vous permettra d'obtenir les résultats.

Cliquez ici pour voir la démo dans SQL Fiddle

script :

CREATE TABLE screenwidth 
(
    id INT NOT NULL
  , user_id INT NOT NULL
  , screenwidth INT NOT NULL
);

INSERT INTO screenwidth (id, user_id, screenwidth) VALUES
  (1, 1, 1366),
  (2, 1, 1366),
  (3, 1, 1366),
  (4, 1, 1366),
  (5, 2, 1920),
  (6, 2, 1920),
  (7, 3, 1920),
  (8, 4, 1280),
  (9, 5, 1280),
  (10, 6, 1280);

SELECT      screenwidth
        ,   COUNT(DISTINCT user_id) AS screenwidthcount
FROM        screenwidth
GROUP BY    screenwidth
ORDER BY    screenwidthcount;

Sortie :

SCREENWIDTH SCREENWIDTHCOUNT
----------- ----------------
1366               1
1920               2
1280               3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X