изменение набора результатов запроса для включения всех дат в диапазон - PullRequest
0 голосов
/ 26 января 2012

У меня есть запрос, который я выполняю для таблицы TXN_DEC(id, resourceid, usersid, date, eventdesc), которая возвращает различное количество пользователей для заданного диапазона дат и идентификатора ресурса, группы по дате и события (каждый ресурс может иметь от 4 до 5 событий)

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

Мне нужно, чтобы в моем наборе результатов или коллекции были все строки даты, чтобы при отсутствии значения count для даты, комбинации событий и событий ее значение было равно 0, но эта дата все еще существует в коллекции.

Как мне получить такую ​​коллекцию

Я знаю, что получить окончательный набор данных полностью из результата запроса было бы слишком сложно, но я могу использовать коллекции в groovy для изменения и заполнения своей карты / списка, чтобы получить данные в требуемом формате

что-то похожее на следующее: if

диапазон дат ввода = с 5 февраля по 3 марта 2011 года

      DataMap = [dateval: '02/05/2011' eventdesc: 'Read' dist_ucnt: 23,
                 dateval: '02/06/2011' eventdesc: 'Read' dist_ucnt: 23,
                 dateval: '02/07/2011' eventdesc: 'Read' dist_ucnt: 0,  -> this row was not present in query resultset, but row exists in the map with value 0
                 ....and so on till 3 march 2011 and then whole range repeated for each eventdesc
                     ] 

1 Ответ

1 голос
/ 26 января 2012

Если вы хотите, чтобы все даты (включая те, у которых нет записей в таблице TXN_DEC) для заданного диапазона, вы можете использовать Oracle для генерации диапазона дат, а затем использовать внешнее объединение с существующим запросом. Тогда вам просто нужно заполнить нулевые значения. Что-то вроде:

select 
    d.dateInRange as dateval,
    'Read' as eventdesc,
    nvl(td.dist_ucnt, 0) as dist_ucnt
from (
    select 
        to_date('02-FEB-2011','dd-mon-yyyy') + rownum - 1 as dateInRange
    from all_objects
    where rownum <= to_date('03-MAR-2011','dd-mon-yyyy') - to_date('02-FEB-2011','dd-mon-yyyy') + 1
) d
left join (
    select 
        date,
        count(distinct usersid) as dist_ucnt
    from
        txn_dec
    where eventDesc = 'Read'
    group by date 
) td on td.date = d.dateInRange

Это мое чисто решение Oracle, так как я не Groovy парень (ну, вообще-то, я довольно отличный парень ...)

РЕДАКТИРОВАТЬ: Вот та же версия, завернутая в хранимую процедуру. Должно быть легко позвонить, если вы знаете API ....

create or replace procedure getDateRange (
    p_begin_date IN DATE, 
    p_end_date IN DATE, 
    p_event IN txn_dec.eventDesc%TYPE,
    p_recordset OUT SYS_REFCURSOR)
AS
BEGIN
    OPEN p_recordset FOR
    select 
        d.dateInRange as dateval,
        p_event as eventdesc,
        nvl(td.dist_ucnt, 0) as dist_ucnt
    from (
        select 
            p_begin_date + rownum - 1 as dateInRange
        from all_objects
        where rownum <= p_end_date - p_begin_date + 1
    ) d
    left join (
        select 
            date,
            count(distinct usersid) as dist_ucnt
        from
            txn_dec
        where eventDesc = p_event
        group by date 
    ) td on td.date = d.dateInRange;
END getDateRange;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...