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
3 Réponses :
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)
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') code> 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?
La présence dans tous les mois peut être effectuée avec une agrégation en 2 étapes:
comme ceci (= 12 peut être une expression dynamique, en fonction de la quantité d'histoire que vous avez) p>
Utiliser les fonctions de la fenêtre. Malheureusement, SQL Server ne prend pas en charge 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. P> P> compteur (distinct) code> comme fonction de fenêtre. Heureusement, il existe un travail simple en utilisant
dense_rank () code>:
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 :)