powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая выборка с данными
7 сообщений из 32, страница 2 из 2
Простая выборка с данными
    #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
7 сообщений из 32, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая выборка с данными
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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