Voici mon tableau:
select count(userid) from ( select userid, count(*) as comingbak from orders where customers in dateadd(week,7,'02/01/2020') groupby comingback having cominback > 1 );
Je souhaite lancer une requête chaque semaine. Je pourrais peut-être passer à une procédure plus tard. Pour l'instant, je souhaite connaître le nombre de clients qui reviennent sur le site pour la semaine commençant le 02/01/2020. Comme vous pouvez le voir dans l'exemple ci-dessus, il n'y a qu'un seul client qui revient ( xxju23
), donc le résultat de ma requête devrait être 1 mais j'ai du mal avec cela.
sessid userid date prodcode xxxxx xx0101 01/01/2020 rpd032 xxxxx xx2021 01/01/2020 xxxx01 xxxxx xx0101 01/01/2020 xx0381 xxxxx xxju23 02/01/2020 xxx023 xxxxx xxjp17 03/01/2020 xxx016 xxxxx xxju23 03/01/2020 xxxx03 xxxxx xx2021 04/01/2020 xxx023 xxxxx xxx270 05/01/2020 xxx023 xxxxx xx0j34 06/01/2020 rpd032 xxxxx xxcj02 07/01/2020 xxx333 xxxxx xxjr04 08/01/2020 rpd032
3 Réponses :
Je comprends que vous recherchez le nombre de clients qui ont effectué plus d'une visite sur le site Web au cours de la semaine qui a commencé le 2 janvier.
Tenez compte de:
select count(*) from ( select 1 from orders where date >= '20200102' and date < dateadd(week, 1, '20200102') group by userid having count(*) > 1 ) t
génial! mais j'ai un problème avec select 1. Je ne comprends tout simplement pas vraiment. mais cela fonctionne très bien.
@Camue: sélectionnez 1
renvoie simplement 1
. Puisque nous voulons simplement compter le nombre de lignes renvoyées par la sous-requête, nous n'avons en fait besoin de rien d'autre.
@Camue: notez que cette solution semble bien plus simple que la réponse acceptée. Y a-t-il une raison pour laquelle vous avez accepté l'autre?
@Oui. Je crois juste qu'il a répondu plus tôt. J'aurais pu avoir une explication pour select 1
et valider votre réponse. Mais je pense juste qu'il répond avant vous. et oui votre solution est bien plus simple
Veuillez vérifier ma réponse ci-dessous pour avoir une meilleure compréhension.
Vous pouvez utiliser datepart (sem, date)
pour obtenir une semaine dans un an.
;with t1 as ( select distinct userid, date from #table1 ), t2 as ( select userid, 'Week ' + cast(datepart(wk, date) as varchar(2)) Week from t1 ), t3 as ( select userid, Week, count(*) as numberOfVisit from t2 group by userid, Week having count(*) > 1) select count(*) Total from t3
Vous pouvez également compter tous les clients pour obtenir le dernier résultat.
;with t1 as ( -- Exclude customer comeback in the same date select distinct userid, date from #table1 ), t2 as (-- Get week in year select userid, 'Week ' + cast(datepart(wk, date) as varchar(2)) Week from t1 ) select userid, Week, count(*) as numberOfVisit -- group by userId and week in year from t2 group by userid, Week having count(*) > 1
Merci. Désolé pour le retard. j'aime vraiment le commentaire; Je n'ai pas pensé à un cte
Ne le mentionnez pas. Bon codage +1
Basé sur le commentaire de GMB. Il y a quelques erreurs suivantes (n'hésitez pas à me corriger si je me trompe):
Où la clause
se combine avec ayant count (*)> 1
est fausse: vous n'obtiendrez aucune valeur> = '20200102' code>. Il doit être value> = '20200101'
xx0101
. Cependant, il doit être exclu car le même jour https://ibb.co/YtbCL1z li >
userId
ou quelque chose comme ça au lieu de 1 car cela crée de la confusion 20200101
alors qu'elle devrait être dynamique. En bref, la réponse à @Phong pourrait être plus appropriée.