Поиск клиентов, которые возвращаются через неделю - PullRequest
1 голос
/ 27 февраля 2020

Вот моя таблица:

 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

Я хочу выполнять запрос каждую неделю. Я мог бы просто превратиться в процедуру позже. На данный момент я хочу знать количество клиентов, возвращающихся на веб-сайт за неделю, начинающуюся 01.02.2020. Как видно из примера выше, возвращается только один клиент (xxju23), поэтому результат моего запроса должен быть равен 1, но я борюсь с ним.

 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
 );

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Демонстрация на дб <> скрипка

Вы можете использовать datepart(wk, date), чтобы получить неделю в году.

;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

enter image description here

Вы также можете Подсчитать всех клиентов , чтобы получить последний результат.

;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

enter image description here

1 голос
/ 27 февраля 2020

Я понимаю, что вы ищете количество клиентов, которые посещали веб-сайт более одного раза за неделю, которая началась 2 января.

Рассмотрим:

select count(*)
from (
    select 1
    from orders
    where date >= '20200102' and date < dateadd(week, 1, '20200102')
    group by userid
    having count(*) > 1
) t
0 голосов
/ 01 марта 2020

На основании комментария GMB. Существуют следующие ошибки (не стесняйтесь исправлять меня, если я ошибаюсь):

  1. Синтаксис ошибки: Не указано имя столбца для столбца 1 в 't'. https://ibb.co/52FBxMc
  2. Условие в предложении Where в сочетании с having count(*) > 1 неверно: вы не получите value >= '20200102'. Это должно быть value >= '20200101'
  3. Вы также получите xx0101. Тем не менее, он должен быть исключен как в тот же день https://ibb.co/YtbCL1z
  4. Вы должны выбрать userId или что-то подобное вместо 1, поскольку это приводит к путанице
  5. Ваше условие работает только во временном диапазоне 20200101, в то время как оно должно быть динамическим c.

Короче говоря, ответ на @Phong может быть более подходящим.

...