Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Простая выборка с данными  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1418
sossisson,
  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
6 дек 18, 10:27    [21755441]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
MazoHist
Member

Откуда:
Сообщений: 36
sossisson,

RTFM start_of_group
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
6 дек 18, 10:30    [21755443]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
MazoHist
Member

Откуда:
Сообщений: 36
MazoHist
sossisson,

RTFM start_of_group

не RTFM а STFF
6 дек 18, 10:32    [21755448]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
-2-
Member

Откуда:
Сообщений: 14095
CN_1
Проще написать функцию и не париться с запросом.
Знание одного языка не предполагает возможность сравнивать с незнакомым языком. Знание в должной степени двух языков декларативного и императивного для данной задачи должно отдавать предпочтение декларативному.
Остается третий вариант, не отягощающий принятие заключений о "проще" - незнание ни sql, ни plsql.
6 дек 18, 11:00    [21755503]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 635
sossisson
mama.said,
Выборку делаю за год.
В общем, при помощи двух group by я могу добиться для каждого пользователя отображения того, сколько дней за год он логинился.
Проблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.


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

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

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)
6 дек 18, 11:38    [21755568]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1137
MaximaXXL
sossisson
mama.said,
Выборку делаю за год.
В общем, при помощи двух group by я могу добиться для каждого пользователя отображения того, сколько дней за год он логинился.
Проблема в том, что я хочу найти тех, кто без перерыва на отпуски и больничные работал. Вот для этого и хочу найти того, кто подряд 7-20-100 дней заходил на сервер.


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

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

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)


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

Вот решение из разряда "Первое, что пришло в голову", на ваших тестовых данных):
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))
6 дек 18, 12:13    [21755620]     Ответить | Цитировать Сообщить модератору
 Re: Простая выборка с данными  [new]
merch
Member

Откуда:
Сообщений: 126
-2-
7 дней подряд без отпуска это произвол!


Так соссиссон и ищет таких людей чтобы премировать.
6 дек 18, 12:28    [21755637]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить