+-------------------------------------------------+-----------------+---------------------+
| landing_page                                    | all_impressions | dates               |
+-------------------------------------------------+-----------------+---------------------+
| https://www.example.co.uk/url-1                 |           53977 | 2018-08-19 13:59:40 |
| https://www.example.co.uk/url-1                 |             610 | 2018-09-19 13:59:40 |
| https://www.example.co.uk/url-1                 |            555  | 2018-10-19 13:59:40 |
| https://www.example.co.uk/url-1                 |            23   | 2018-11-19 13:59:40 |
| https://www.example.co.uk/                      |            1000 | 2018-06-19 13:59:40 |
| https://www.example.co.uk/                      |               2 | 2018-07-19 13:59:40 |
| https://www.example.co.uk/                      |               4 | 2018-08-19 13:59:40 |
| https://www.example.co.uk/                      |            1563 | 2018-09-19 13:59:40 |
| https://www.example.co.uk/                      |               1 | 2018-10-19 13:59:40 |
| https://www.example.co.uk/                      |            9812 | 2018-11-19 13:59:40 |
+-------------------------------------------------+-----------------+---------------------+

Avec la table de base de données ci-dessus, je souhaite uniquement sélectionner la landing_page si le nombre d'impressions est le maximum pour la date actuelle - Par exemple, à partir de là, la sélection renverrait https://www.example.co.uk/ uniquement car la valeur du mois en cours est all_impressions est la plus élevée pour novembre (https://www.example.co.uk/url-1 ne serait pas sélectionné car sa valeur la plus élevée était en août)

Comment puis-je faire cela avec SQL?

Informations d'index:

mysql> show indexes from landing_pages_client_v3;
+-------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                   | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| landing_pages_client_v3 |          0 | PRIMARY      |            1 | id          | A         |    24279939 |     NULL | NULL   |      | BTREE      |         |               |
| landing_pages_client_v3 |          1 | profile_id   |            1 | profile_id  | A         |          17 |     NULL | NULL   | YES  | BTREE      |         |               |
| landing_pages_client_v3 |          1 | profile_id   |            2 | dates       | A         |          17 |     NULL | NULL   |      | BTREE      |         |               |
| landing_pages_client_v3 |          1 | profile_id_2 |            1 | profile_id  | A         |          17 |     NULL | NULL   | YES  | BTREE      |         |               |
| landing_pages_client_v3 |          1 | profile_id_2 |            2 | lp_id       | A         |     6069984 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4
Adders 20 nov. 2018 à 19:28

3 réponses

Meilleure réponse

Dans une table dérivée, obtenez la valeur maximale de all_impressions pour chaque landing_page. Rejoignez la table principale pour obtenir la ligne correspondant à la valeur maximale all_impressions.

Nous ne considérerons finalement cette ligne que si elle appartient au mois en cours. Pour sargabilité, nous n'utiliserons pas les fonctions de la colonne dates . Au lieu de cela, nous déterminerons le premier jour du mois en cours et le mois suivant. Nous allons considérer ceux dates qui appartiennent à cette plage. Vous pouvez vérifier les détails des fonctions datetime ici: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

Pour les performances, vous pouvez également avoir besoin d'ajouter l'index composite suivant: (landing_page, all_impressions, dates). (Je ne suis pas sûr de l'ordre dans lequel ces colonnes devraient être. Peut-être qu'une analyse comparative / un essai est nécessaire.

SELECT
  t.* 
FROM 
  your_table AS t 
JOIN 
(
  SELECT
    landing_page, 
    MAX(all_impressions) AS max_all_impressions
  FROM your_table 
  GROUP BY landing_page
) AS dt 
  ON dt.landing_page = t.landing_page AND 
     dt.max_all_impressions = t.all_impressions 
WHERE 
 t.dates >= ((LAST_DAY(CURDATE()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH) AND
 t.dates < (LAST_DAY(CURDATE()) + INTERVAL 1 DAY) 
2
Madhur Bhaiya 21 nov. 2018 à 10:24

Vous pouvez essayer de cette manière pour sélectionner l'url landing_page et la valeur maximale de la colonne all_impressions. Pour ce faire, vous devez utiliser la clause WHERE pour vérifier que la valeur de votre colonne dates est le même mois et année que le nombre CURRENT_DATE. VOIR Fonctions de date et d'heure

SELECT landing_page,MAX(all_impressions) 
 FROM your_table_name_goes_here
WHERE MONTH(dates) = MONTH(CURRENT_DATE())
 AND YEAR(dates) = YEAR(CURRENT_DATE())

OU

SELECT landing_page
  FROM your_table_name_goes_here
WHERE MONTH(dates) = MONTH(CURRENT_DATE())
  AND YEAR(dates) = YEAR(CURRENT_DATE())
ORDER BY all_impressions DESC LIMIT 1
0
Always Sunny 20 nov. 2018 à 16:40

Dans mysql. vous pouvez faire comme ça.

SELECT landing_page,MAX(all_impressions) AS max_count
  FROM your_table_name_goes_here
    WHERE MONTH(dates) = MONTH(NOW()) AND YEAR(dates) = YEAR(NOW())
     GROUP BY landing_page ORDER BY max_count DESC LIMIT 1
0
Syed Ausaf Hussain 20 nov. 2018 à 16:49