Oracle SQL - ищите новых пользователей, которые не были показаны на прошлой неделе - PullRequest
0 голосов
/ 08 октября 2019

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

Структура БД с данными (таблица имеет два столбца WebAppUserName и URL ):

WebAppUserName           URL  
Tom                       google.com

первая неделя Данные в БД:

  Tom                      google.com
  Jim                      google.com/test
  Ken                      google.com/test

Вторая неделя (последняя неделя) Данные в БД:

  Tom                      google.com
  Jim                      google.com/test

Эта неделя (Третья неделя) Данные в БД:

 Tom                      google.com
 Jim                      google.com/test
 Ken                    google.com/test
 Ron                    google.com/test

Поскольку Кен и Рон не делали 'Появились данные на прошлой неделе, и они оба появились на этой неделе.> Мне нужно получить информацию только Кена и Рона, а не других пользователей. Как написать запрос для> этого.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

В вашей таблице должен быть столбец даты, чтобы определить, когда пользователь получил доступ к URL.

Вы можете использовать not exists что-то вроде следующего:

Select t.* from
Your_table t
Where trunc(t.date,'IW') = trunc(SYSDATE,'IW') -- fetch current week data
AND NOT EXISTS 
(SELECT 1 
FROM YOUR_TABLE TT
WHERE trunc(t.date,'IW') - trunc(TT.date,'IW') = 7 -- exclude user who appeared last week
AND TT.WEBAPPUSERNAME = T.WEBAPPUSERNAME) -- you can also add condition for URL in not exists if required in your logic

Cheers !!

0 голосов
/ 08 октября 2019

row_number() является типичным решением:

select t.*
from (select t.*,
             row_number() over (partition by WebAppUserName order by datecol) as seqnum
      from t
     ) t
where seqnum = 1;

Часто коррелированный подзапрос имеет хорошую производительность:

select t.*
from t
where t.datecol = (select min(t2.datecol)
                   from t t2
                   where t2.WebAppUserName = t.WebAppUserName
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...