0
votes

SQL - Utilisez uniquement des clients présents dans tous les mois

J'ai un jeu de données avec différents clients et leur nombre de ventes. Au fil du temps, certains clients sont ajoutés et supprimés des données. Comment puis-je vous assurer que lorsque je regarde les chiffres des ventes, que je n'utilise que la sélection des clients qui se trouvaient dans le jeu de données tout le temps? C'est-à-dire si j'ai un client qui n'a pas d'enregistrement pour 2018-03, je ne souhaite pas que le client participe à toute la requête. Si un client n'a pas d'enregistrement en 2020-03, je ne veux pas non plus que ce client fait partie de toute la requête.

Par exemple, la requête suivante: P>

year    month   count
2018    1   78
2018    2   83
2018    3   80
2018    4   83
2018    5   84
2018    6   81
2018    7   83
2018    8   90
2018    9   89
2018    10  95
2018    11  94
2018    12  97
2019    1   102
2019    2   103
2019    3   102
2019    4   105
2019    5   103
2019    6   104
2019    7   104
2019    8   106
2019    9   106
2019    10  108
2019    11  109
2019    12  104
2020    1   104
2020    2   102
2020    3   103
2020    4   98
2020    5   97
2020    6   79


6 commentaires

Quel produit DBMS utilisez-vous? "SQL" est juste une langue de requête, pas le nom d'un produit de base de données spécifique. Veuillez ajouter un tag pour le produit de base de données que vous utilisez. Pourquoi devrais-je marquer mon DBMS


Donc, si vous avez un client qui n'a pas d'enregistrement pour 2018-03-02, vous ne voulez pas que le client participe à la requête? Ou est-ce juste pour le mois de 2018-03? Ou le client doit simplement être là en 2018-01 et également au 2020-2006, mais cela est correct s'il manque en mars? Que signifie "ils ne devraient pas être plus de 78"? Vous n'avez que 78 au total et limitez la requête à max 78 sur chaque rangée?


@a_horse_with_no_name C'était plus une question conceptuelle, c'est pourquoi je n'ai pas marqué le produit spécifique, mais pour ce projet spécifique, j'utilise Amazon Redshift. Va ajouter à la balise si cela aide.


@Scratte Je voulais dire qu'ils ne devraient pas être plus de 78 rangées car c'est la quantité minimale de lignes (au cours du premier mois). Donc, si je veux m'assurer que tous les clients existent dans toutes les lignes, il ne peut pas être plus de 78. Si j'ai un client qui n'a pas d'enregistrement pour 2018-03-02, je ne veux pas que ce client soit partie de la requête.


C'est très important et vous devriez mentionner que les clients doivent avoir un record de tous les jours de toute la période (tous les jours ne sont pas les mêmes que tous les mois), pas seulement des enregistrements de chaque mois. Parce que si elles doivent juste être présentes en 2018-01 et être toujours en 2020-06, la requête est très simple.


Il y a beaucoup d'utilisateurs qui joueront avec des questions sur des violons en ligne pour s'assurer qu'ils travaillent lorsqu'ils répondent aux questions. Je ne pense pas qu'il y en a un pour Amazon-Redshift. Si vous êtes d'accord avec une requête qui est SQL-Server / Oracle / MySQL / PostgreSQL, alors mentionne cela aussi (dans la question, car les commentaires disparaissent parfois :)


3 Réponses :


0
votes

Si je comprends ce que vous voulez correctement, et s'il s'agit simplement d'une requête unique, vous pouvez utiliser une sous-requête corrélée dans la clause WHERE:

SELECT 
    DATE_PART(y, s.sold_date) AS year,
    DATE_PART(mm, s.sold_date) AS month,
    COUNT(DISTINCT s.client)
FROM
    sales_data AS s
WHERE
    EXISTS (
        SELECT sd.client FROM sales_data AS sd WHERE DATE_PART(y, 
        sd.sold_date) = 2018 AND DATE_PART(mm, sd.sold_date) = 1 AND 
        sd.client = s.client
    ) AND
    s.sold_date > '2018-01-01' 
GROUP BY
    year,
    month 
ORDER
    DATE_PART(y, s.sold_date),
    DATE_PART(mm, s.sold_date)


6 commentaires

Pourquoi un calcul dans la sous-requête?


Il semble qu'ils ne veulent que les clients existants en 2018-01.


Ce n'est pas entièrement ce dont j'ai besoin. Désolé si je n'étais pas clair mais je veux regarder ce que les clients existaient dans chaque mois et si un client n'existait pas dans un mois spécifique, je souhaite également les exclure du reste de la requête.


Je t'ai eu. Vous pourriez avoir besoin d'utiliser une boucle, mais je ne suis pas tout à fait sûr ...


@ Ferdinand55 Même si c'était vrai, la sous-requête aurait pu être juste (Sélectionnez 1 dans Sales_Data comme SD SD où sd.client = S.Client et SD.SOLD_Date <'2018-02-01') qui C'est pourquoi j'ai été perplexe par le calcul.


Pouvez-vous compter le nombre de mois au cours de la période, compter le nombre de mois distincts qu'un client est apparu et comparer les 2?



0
votes

La présence dans tous les mois peut être effectuée avec une agrégation en 2 étapes:

  1. Données de vente de groupe par l'ID client ayant tous les mois
  2. Données de vente de groupe jointes à (1) par année, mois

    comme ceci (= 12 peut être une expression dynamique, en fonction de la quantité d'histoire que vous avez) xxx


0 commentaires

0
votes

Utiliser les fonctions de la fenêtre. Malheureusement, SQL Server ne prend pas en charge compteur (distinct) comme fonction de fenêtre. Heureusement, il existe un travail simple en utilisant dense_rank () : xxx

Remarque: ceci regarde tous les mois qui figurent dans les données. Si tous les clients sont manquants 2019-03, alors ces mois ne sont pas du tout pris en compte.


0 commentaires