Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Выборка значений между датами в HAVING  [new]
Никита Жуйков
Member

Откуда:
Сообщений: 6
Добрый день.

Не могу решить одну задачу

Необходимо вывести id всех пользователей которые производили какие то действия по следующим характеристикам Дата начала действия <= текущей даты и Дата окончания действия > текущей даты

Есть таблица

iduser_iddate_typedate_value
11111-10-2014
21211-20-2014
32111-14-2014
42212-01-2014
53111-01-2014
63211-10-2014


Где
user_id - id пользователя
date_type- тип даты (1 - дата начала, 2 - дата окончания)

Делая запрос только по одному типу даты, все проходит как надо.

SELECT user_id
FROM users_actions
GROUP BY user_id,date_value,date_type
HAVING (date_value > TO_DATE(SYSDATE,'mm-dd-yyyy') AND data_type=2)


А вот делая запрос между датами начала и конца, получаю ноль строк

SELECT user_id
FROM users_actions
GROUP BY user_id,date_value,date_type
HAVING (date_value > TO_DATE(SYSDATE,'mm-dd-yyyy') AND data_type=2)
AND (date_value <= TO_DATE(SYSDATE,'mm-dd-yyyy') AND data_type=1)


Вопрос такой есть ли какая то функция в Oracle которая позволяем делать выборку между датами в HAVING. Или же мой подход к данной задаче в корне не верный?

Буду признателен за помощь.

Заранее благодарен.
16 ноя 14, 15:17    [16853852]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51815

Никита Жуйков
Или же мой подход к данной задаче в корне не верный?

Угу, неверный. причём неверность начинается уже в структуре таблицы в которой отсутствует
поле, идентифицирующее действие.

Posted via ActualForum NNTP Server 1.5

16 ноя 14, 15:26    [16853884]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
SELECT  user_id
  FROM  users_actions
  GROUP BY user_id
  HAVING COUNT(CASE WHEN date_value > TRUNC(SYSDATE) AND data_type = 2 THEN 1 END) > 0
     AND COUNT(CASE WHEN date_value <= TRUNC(SYSDATE) AND data_type = 1 THEN 1 END) > 0
/
16 ноя 14, 15:40    [16853929]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
Никита Жуйков
Member

Откуда:
Сообщений: 6
Dimitry Sibiryakov,

Данное поле мне не нужно.

Но я был бы вам очень признателен если бы вы направили меня на верный путь
16 ноя 14, 15:41    [16853930]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51815

Никита Жуйков
Но я был бы вам очень признателен если бы вы направили меня на верный
путь

Тогда задайся вопросом что будет с твоими выборками если один и тот же пользователь
произведёт несколько действий в различное время.

Posted via ActualForum NNTP Server 1.5

16 ноя 14, 16:04    [16854017]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
автор
date_type- тип даты (1 - дата начала, 2 - дата окончания)

кто мешал тебе юный гений сделать 2 поля?
17 ноя 14, 08:07    [16856231]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
good_name
Member

Откуда:
Сообщений: 75
alex-ls
кто мешал тебе юный гений сделать 2 поля?

подозреваю, что это лог какой-то системы доступа, типа работник зашел в офис/работник вышел из офиса
17 ноя 14, 18:28    [16861232]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
taranezzz
Member

Откуда:
Сообщений: 42
Никита Жуйков,
ну как то так. Спецы критикуйте ( where ld is not null )!!!!
select us, d1, ld
from(
select us, d1, d2,
LEAD(d2, 1) OVER (ORDER BY us) ld
from(

select us,
decode(d,1,dat,null) d1,
decode(d,2,dat,null) d2
from(
select 1 id, 1 us, 1 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual union all
select 2 id, 1 us, 2 d, to_date('11-20-2014','mm-dd-yyyy') dat from dual union all
select 3 id, 2 us, 1 d, to_date('11-14-2014','mm-dd-yyyy') dat from dual union all
select 4 id, 2 us, 2 d, to_date('12-01-2014','mm-dd-yyyy') dat from dual union all
select 5 id, 3 us, 1 d, to_date('11-01-2014','mm-dd-yyyy') dat from dual union all
select 6 id, 3 us, 2 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual
)

)
)
where ld is not null
order by us asc
;
17 ноя 14, 21:24    [16861920]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
хэвинг
Guest
Никита Жуйков,

1. если Вы прочитали про HAVING, попробуйте прочитать про WHERE.
2. касательно приведенного запроса - как Вы думаете как могут строки с Date_type равным 1 попасть в ту же группу, что и строки с date_type =2 ? ( это то что у вас в Having написано...)
18 ноя 14, 01:10    [16862647]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
stax..
Guest
Никита Жуйков,
варинтов очень много
  1  with t as (
  2  select 1 id, 1 us, 1 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual union all
  3  select 2 id, 1 us, 2 d, to_date('11-20-2014','mm-dd-yyyy') dat from dual union all
  4  select 3 id, 2 us, 1 d, to_date('11-14-2014','mm-dd-yyyy') dat from dual union all
  5  select 4 id, 2 us, 2 d, to_date('12-01-2014','mm-dd-yyyy') dat from dual union all
  6  select 5 id, 3 us, 1 d, to_date('11-01-2014','mm-dd-yyyy') dat from dual union all
  7  select 6 id, 3 us, 2 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual
  8  )
  9  select us from
 10   (select id,us,d, dat dat_from
 11    ,lead(dat) over (partition by us order by d) dat_to
 12    from t)
 13* where d=1 and sysdate>=dat_from and sysdate <=dat_to
SQL> /

        US
----------
         1
         2


или Вам надо с помощью хавинг?
  1  with t as (
  2  select 1 id, 1 us, 1 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual union all
  3  select 2 id, 1 us, 2 d, to_date('11-20-2014','mm-dd-yyyy') dat from dual union all
  4  select 3 id, 2 us, 1 d, to_date('11-14-2014','mm-dd-yyyy') dat from dual union all
  5  select 4 id, 2 us, 2 d, to_date('12-01-2014','mm-dd-yyyy') dat from dual union all
  6  select 5 id, 3 us, 1 d, to_date('11-01-2014','mm-dd-yyyy') dat from dual union all
  7  select 6 id, 3 us, 2 d, to_date('11-10-2014','mm-dd-yyyy') dat from dual
  8  )
  9  select us from t
 10  group by us
 11  having
 12      min(decode(d,1,dat))<=sysdate
 13* and max(decode(d,2,dat))>=sysdate
SQL> /

        US
----------
         1
         2


і тд

.....
stax
18 ноя 14, 14:58    [16865796]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений между датами в HAVING  [new]
Никита Жуйков
Member

Откуда:
Сообщений: 6
Спасибо всем большое за помощь.
19 ноя 14, 17:42    [16873615]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить