1
votes

Trouver les clients qui reviennent dans une semaine

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


0 commentaires

3 Réponses :


1
votes

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


5 commentaires

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.



1
votes

Démo sur db fiddle

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

 entrez la description de l'image ici

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

 entrez la description de l'image ici


2 commentaires

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



0
votes

Basé sur le commentaire de GMB. Il y a quelques erreurs suivantes (n'hésitez pas à me corriger si je me trompe):

  1. Syntaxe d'erreur: Aucun nom de colonne n'a été spécifié pour la colonne 1 de "t". https: //ibb.co/52FBxMc
  2. La condition dans Où la clause se combine avec ayant count (*)> 1 est fausse: vous n'obtiendrez aucune valeur> = '20200102' . Il doit être value> = '20200101'
  3. Vous obtiendrez également xx0101 . Cependant, il doit être exclu car le même jour https://ibb.co/YtbCL1z
  4. Vous devez sélectionner userId ou quelque chose comme ça au lieu de 1 car cela crée de la confusion
  5. Votre condition ne fonctionne que dans la plage de temps 20200101 alors qu'elle devrait être dynamique.

En bref, la réponse à @Phong pourrait être plus appropriée.


0 commentaires