powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая выборка с данными
32 сообщений из 32, показаны все 2 страниц
Простая выборка с данными
    #39742788
sossisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть лог входа пользователей в систему с информацией пользователь-дата входа.
USERAUTH_DATE1'01-01-2018'2'01-01-2018'1'02-01-2018'3'01-01-2018'1'03-01-2018'


Как сделать запрос, который покажет кто из пользователей заходил каждый день в течении недели или месяца?
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742793
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,

count(distinct ) + group by + having
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742939
sossisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,
это понятно. Но я хотел выбрать именно, где 7 дней подряд люди есть в логах.
Я так понимаю, что без аналитических функций здесь не обойтись, но вот как?
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742943
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе и ответили
count(distinct )=7
count(distinct )=30(31)
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742944
sossisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183,
разве это будет работать, если пользователь заходил не все дни подряд, а были перерывы по 3-4 дня?
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742952
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача тогда не та, которую ты написал.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742964
sossisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183,
я же написал в первом посте "запрос, который покажет кто из пользователей заходил каждый день в течении недели или месяца"
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742975
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поищи темы про объединение временных промежутков.
Сформируешь данные по типу:
Код: plaintext
1.
2.
3.
1 '01-01-2018'  '03-01-2018'
2 '01-01-2018'  '11-01-2018'
3 '01-01-2018'  '02-01-2018'

Ну и выбираешь те записи, у которых разница между датами >= 7.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742981
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,

Напишите Ваш селект, или хотябы тестовые данные в формате with, а то пока не понятно что вообще Вы хотите

Код: plsql
1.
2.
3.
4.
5.
select "USER", count(distinct trunc(AUTH_DATE))
from table
where trunc(AUTH_DATE) between :p_Date_From and :p_Date_To
group by "USER"
having count(distinct trunc(AUTH_DATE)) = 1+:p_Date_To - :p_Date_From
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742983
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,

надеюсь, AUTH_DATE имеет тип DATE?

но в целом, "курите" в эту торону :
trunc(AUTH_DATE) - dense_rank() over(partition by user order by trunc(AUTH_DATE)) as grp_id

далее - группировка по user , grp_id и фильтрация результата группировки по уже упомянутому count(distinct trunc(AUTH_DATE)) в упомянутом же HAVING-е
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742985
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossissonв течении недели или месяцаа это течени е , все-таки, семь дней, семь суток или неделя. И течение месяца, это месяц или сколько-то там суток, в зависимости от ...
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742986
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLsossisson,

Напишите Ваш селект, или хотябы тестовые данные в формате with, а то пока не понятно что вообще Вы хотите

Код: plsql
1.
2.
3.
4.
5.
select "USER", count(distinct trunc(AUTH_DATE))
from table
where trunc(AUTH_DATE) between :p_Date_From and :p_Date_To
group by "USER"
having count(distinct trunc(AUTH_DATE)) = 1+:p_Date_To - :p_Date_From

пользователь мог три дня ходить по сто раз, затем день перекурить и ещё четыре дня ходить по 10 раз. Будет ли это "семь дней подряд" в постановке автора? Вряд ли. А в решении вашим запросом? Запросто...
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742988
Zhelezyakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sossisson,

Думаю, вам надо пойти от обратного . Для выбранного интервала ищите даты когда данный пользователь не регистрировался.
Если такой запрос вернет ноль записей , значит данный пользователь регистрировался каждый день.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742992
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossissonя же написал в первом посте "запрос, который покажет кто из пользователей заходил каждый день в течении недели или месяца"
А выборку ты делаешь за неделю/месяц или за более длительный срок?
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39742995
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Не совсем понятно при чем тут перекур в 1 день, если Вас смущает 1+ то это из за between который учитывает оба параметра.
итого например между 07.01.2018 и 01.01.2018 разница 6 (а человек думает что 7 ) отсюда и появилось 1+
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743006
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson982183,
разве это будет работать, если пользователь заходил не все дни подряд, а были перерывы по 3-4 дня?

не важно сколько раз заходил count(distinct trunc (AUTH_DATE)) даст для одного дня 1

если были перерывы, то count не совпадет с к-вом дней за период

другой вопрос, учитывать только рабочие дни или календарные?

....
stax
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743025
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Дату начала и дату кончала - это уже вы сами додумали. В исходной постановке задачи у ТС про это нет ни слова. ;). Положим, период - плавающий. Первый пользователь логинился каждый день с первого по седьмое число. Второй - с десятого по шестнадцатое. Формально - оба логинились каждый день в течении недели. Но если ограничить период датами с шестого по двенадцатое, как предлагаете вы, то ни один пользователь не логинился семь дней подряд.
Понимаете, о чем я? ;)
Единственное, в чем с вами не поспоришь, так это то, что задача сформулирована очень размыто и нечетко. И каждый её решает, как понял. А что на самом деле нужно Т -
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743026
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаMaximaXXL,

Дату начала и дату кончала - это уже вы сами додумали. В исходной постановке задачи у ТС про это нет ни слова. ;). Положим, период - плавающий. Первый пользователь логинился каждый день с первого по седьмое число. Второй - с десятого по шестнадцатое. Формально - оба логинились каждый день в течении недели. Но если ограничить период датами с шестого по двенадцатое, как предлагаете вы, то ни один пользователь не логинился семь дней подряд.
Понимаете, о чем я? ;)
Единственное, в чем с вами не поспоришь, так это то, что задача сформулирована очень размыто и нечетко. И каждый её решает, как понял. А что на самом деле нужно ТС-у - одному ему известно
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743034
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

мы по разному понимаем
авторКак сделать запрос, который покажет кто из пользователей заходил каждый день в течении недели или месяца?
я считаю что надо показать пользователей которые логинились каждый день за конкретный период,
напр в октябре 2018 года

.....
stax
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743052
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sossisson,

хорошо бы еще понимать в каком виде нужен аутпут

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with dt as (
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 2 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('02-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 3 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('03-01-2018', 'dd-mm-yyyy') as auth_date from dual
)
select * 
from dt
pivot (
  count(*) for auth_date in (to_date('01-01-2018', 'dd-mm-yyyy') as "01_jan_2018", to_date('02-01-2018', 'dd-mm-yyyy') as "02_jan_2018", to_date('03-01-2018', 'dd-mm-yyyy') as "03_jan_2018") 
)



Код: html
1.
2.
3.
4.
USR  01_jan_2018  02_jan_2018 03_jan_2018
1	      2	         1	     1
2	      1	         0           0
3	      1	         0           0
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743225
sossisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mama.said,
Выборку делаю за год.
В общем, при помощи двух group by я могу добиться для каждого пользователя отображения того, сколько дней за год он логинился.
Проблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743229
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,

Вам уже все возможные случаи подсказали, как решать. Осталось только выбрать наиболее подходящий.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743230
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossissonПроблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.7 дней подряд без отпуска это произвол!
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743243
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossissonПроблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал.
а также без выходных и праздников, т.е 24/7/365.
так это можно без запроса получить - сервер БД
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743276
CN_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sossisson,

Проще написать функцию и не париться с запросом.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743291
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  1  with dt as (
  2    select 1 as usr, to_date('01-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  3    select 1 as usr, to_date('01-01-2018 11:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  4    select 1 as usr, to_date('02-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  5    select 1 as usr, to_date('03-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  6    select 1 as usr, to_date('04-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  7    select 1 as usr, to_date('06-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  8    select 1 as usr, to_date('07-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
  9    select 2 as usr, to_date('02-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
 10    select 2 as usr, to_date('03-01-2018 11:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
 11    select 2 as usr, to_date('11-01-2018 10:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual union all
 12    select 2 as usr, to_date('11-01-2018 12:00', 'dd-mm-yyyy hh24:mi') as auth_date from dual
 13  )
 14  ,t as (select distinct usr,trunc(auth_date) dat from dt)
 15  ,tt as (select t.*,dat-row_number() over (partition by usr order by dat) gr from t)
 16  ,ttt as (select usr,max(dat)-min(dat)+1 dn from tt group by usr,gr)
 17* select usr,max(dn) max_dn from ttt group by usr
SQL> /

       USR     MAX_DN
---------- ----------
         1          4
         2          2



.....
stax
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743292
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossisson,

RTFM start_of_group
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with dt as (
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 2 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('02-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 3 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('03-01-2018', 'dd-mm-yyyy') as auth_date from dual
)
select usr
     , sog 
  from (select usr
             , lead(auth_date,1,auth_date+1) over (partition by usr order by auth_date )-auth_date sog
          from dt)
  where sog = 1
group by usr, sog 
  having count(*) = 3
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743294
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistsossisson,

RTFM start_of_group

не RTFM а STFF
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743327
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CN_1Проще написать функцию и не париться с запросом.Знание одного языка не предполагает возможность сравнивать с незнакомым языком. Знание в должной степени двух языков декларативного и императивного для данной задачи должно отдавать предпочтение декларативному.
Остается третий вариант, не отягощающий принятие заключений о "проще" - незнание ни sql, ни plsql.
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743363
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sossissonmama.said,
Выборку делаю за год.
В общем, при помощи двух group by я могу добиться для каждого пользователя отображения того, сколько дней за год он логинился.
Проблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.

Я надеюсь Вы из отдела кадров и хотите отправить человека в отпуск иначе это нарушение конституции

Похоже Вам надо что-то вроде такого, но постановка оставляет желать лучшего

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with dt as (
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 2 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('02-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 3 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('05-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('06-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('07-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('08-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('10-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('11-01-2018', 'dd-mm-yyyy') as auth_date from dual
)
select usr, sum(decode(delta,1,1,0))+1 result
from( select usr
           , delta
           , sum(flag) over (partition by usr order by auth_date asc, usr) as group_no 
           , auth_date
       from( select usr 
                  , auth_date - lag(auth_date,1,auth_date) over (partition by usr order by auth_date ) delta 
                  , decode(auth_date - lag(auth_date,1,auth_date) over (partition by usr order by auth_date ),1,null,0,null,1) flag
                  , auth_date
               from dt)
)
group by usr, group_no
--having sum(decode(delta,1,1,0))+1 >= 3
order by usr, min(auth_date)
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743381
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLsossissonmama.said,
Выборку делаю за год.
В общем, при помощи двух group by я могу добиться для каждого пользователя отображения того, сколько дней за год он логинился.
Проблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.

Я надеюсь Вы из отдела кадров и хотите отправить человека в отпуск иначе это нарушение конституции

Похоже Вам надо что-то вроде такого, но постановка оставляет желать лучшего

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with dt as (
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 2 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('02-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 3 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('05-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('06-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('07-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('08-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('10-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('11-01-2018', 'dd-mm-yyyy') as auth_date from dual
)
select usr, sum(decode(delta,1,1,0))+1 result
from( select usr
           , delta
           , sum(flag) over (partition by usr order by auth_date asc, usr) as group_no 
           , auth_date
       from( select usr 
                  , auth_date - lag(auth_date,1,auth_date) over (partition by usr order by auth_date ) delta 
                  , decode(auth_date - lag(auth_date,1,auth_date) over (partition by usr order by auth_date ),1,null,0,null,1) flag
                  , auth_date
               from dt)
)
group by usr, group_no
--having sum(decode(delta,1,1,0))+1 >= 3
order by usr, min(auth_date)



Столько много лишних телодвижений...

Вот решение из разряда "Первое, что пришло в голову", на ваших тестовых данных):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with dt as (
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 2 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('02-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 3 as usr, to_date('01-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('05-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('06-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('07-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('08-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('10-01-2018', 'dd-mm-yyyy') as auth_date from dual union all
  select 1 as usr, to_date('11-01-2018', 'dd-mm-yyyy') as auth_date from dual
)
--
--
select usr, count(distinct trunc(auth_date)) as cnt 
  from (
          select dt.*
               , dense_rank() over(partition by usr order by trunc(auth_date)) as dnr
            from dt
       ) v
 group by usr, trunc(auth_date) - dnr
 order by usr, min(trunc(auth_date))
...
Рейтинг: 0 / 0
Простая выборка с данными
    #39743388
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2- 7 дней подряд без отпуска это произвол!

Так соссиссон и ищет таких людей чтобы премировать.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая выборка с данными
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]