Исключить дубликаты в пользовательском SQL сервера таблиц (DB2) - PullRequest
0 голосов
/ 23 марта 2019

Мне нужно создать флаг, чтобы руководители могли понять, как используется система. У нас есть 3 основные системы, в которых работают люди, и мы пытаемся вывести пользователей из одной из них. Мой запрос делает это, но природа таблицы, которую я запрашиваю, включает дубликаты, потому что поле CREATE_USER_CD не отличается. Повторяется (для каждого FROM_ID) для каждого типа события, связанного с заказом.

Я пытался добавить это как условие, чтобы включить только последнего пользователя, который вызвал событие TYPE_ID, которое я ищу:

    and e.MISC_EVENT_ID in (select max(MISC_EVENT_ID) 

    from VASDW.MISC_EVENT 

    where date(CREATE_TS) between '2019-01-01 and current date

    group by FROM_ID)

Это основная направленность сценария:

select e.CREATE_TS, e.MISC_EVENT_ID, e.CREATE_USER_CD, e.FROM_ID,

(case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD

and trim(e.CREATE_USER_CD) <> 'jboss' 

and trim(e.CREATE_USER_CD) <> 'MTier'

and trim(e.CREATE_USER_CD) <> 'wlsedi' 

and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) 

as CLG_FG

from VASDW.MISC_EVENT e

where date(e.CREATE_TS) between '2019-01-01' and current date

Я ожидаю получить MISC_EVENT_ID последнего пользователя, создавшего тип события, который я ищу, когда добавляю вышеуказанное условие. Однако я получаю дубликаты.

CREATE_TS          MISC_EVENT_ID CREATE_USER_CD FROM_ID  CLG_FG
2019-03-20 14:00    1236064301    Sego, Jona    15293831     1
2019-03-21 10:48    1236092481    Barnes, Ja    15293831     1

Есть какие-нибудь идеи, кроме написания этого как CTE, чтобы помочь? Я не могу написать CTE, потому что я использую этот пользовательский SQL как часть большой книги Tableau Server. Мои значения верны, потому что я использую countd () в Таблице, но дубликаты отображаются, когда вы делаете извлечение. Кто-то спросит это в скором времени, поэтому я стараюсь вообще этого избежать.

ТИА.

Ответы [ 3 ]

0 голосов
/ 23 марта 2019

Что касается вашего примера кода. Вы не включаете одно и то же выражение case в предложение where вашего подпункта с group by. Запустите его как есть.
Получаете ли вы ожидаемый результат (только для 2-й строки) по следующим данным?

with "VASDW.MISC_EVENT" 
(CREATE_TS, MISC_EVENT_ID, CREATE_USER_CD, FROM_ID, TYPE_ID, FROM_CLASS_ID) as (values
  (timestamp('2019-03-20-14.00.00'), 1236064301, 'Sego, Jona', 15293831, 1852, 32)
, (timestamp('2019-03-21-10.48.00'), 1236092481, 'Barnes, Ja', 15293831, 1852, 32)
, (timestamp('2019-03-20-14.00.00'), 2236064301, 'Sego, Jona', 15293832, 1852, 32)
, (timestamp('2019-03-21-10.48.00'), 2236092481, 'BARNES, JA', 15293832, 1852, 32)
)
select e.FROM_ID, e.CREATE_USER_CD, e.MISC_EVENT_ID,
(case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
    and trim(e.CREATE_USER_CD) <> 'jboss' 
    and trim(e.CREATE_USER_CD) <> 'MTier'
    and trim(e.CREATE_USER_CD) <> 'wlsedi' 
    and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) as CLG_FG
from "VASDW.MISC_EVENT" e
    where date(e.CREATE_TS) between '2019-01-01' and current date
    and e.TYPE_ID = 1852
    and e.FROM_CLASS_ID = 32 
    and (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
        and trim(e.CREATE_USER_CD) <> 'jboss' 
        and trim(e.CREATE_USER_CD) <> 'MTier'
        and trim(e.CREATE_USER_CD) <> 'wlsedi' 
        and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end = 1)
    and e.MISC_EVENT_ID in (
        select max(e2.MISC_EVENT_ID) 
        from "VASDW.MISC_EVENT" e2 
            where e2.TYPE_ID = 1852
            and e2.FROM_CLASS_ID = 32
            and date(e2.CREATE_TS) between '2019-01-01' and current date
    group by e2.FROM_ID);
0 голосов
/ 24 марта 2019
select e.FROM_ID, e.CREATE_USER_CD, e.MISC_EVENT_ID,
(case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
    and trim(e.CREATE_USER_CD) <> 'jboss' 
    and trim(e.CREATE_USER_CD) <> 'MTier'
    and trim(e.CREATE_USER_CD) <> 'wlsedi' 
    and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end) as CLG_FG
from VASDW.MISC_EVENT e
    where date(e.CREATE_TS) between '2019-01-01' and current date
    and e.TYPE_ID = 1852
    and e.FROM_CLASS_ID = 32 
    and (case when upper(e.CREATE_USER_CD) <> e.CREATE_USER_CD
        and trim(e.CREATE_USER_CD) <> 'jboss' 
        and trim(e.CREATE_USER_CD) <> 'MTier'
        and trim(e.CREATE_USER_CD) <> 'wlsedi' 
        and trim(e.CREATE_USER_CD) <> 'svrcflp' then 1 else 0 end = 1)
    and e.MISC_EVENT_ID in (
        select max(e2.MISC_EVENT_ID) 
        from VASDW.MISC_EVENT e2 
            where e2.TYPE_ID = 1852
            and e2.FROM_CLASS_ID = 32
            and date(e2.CREATE_TS) between '2019-01-01' and current date
    group by e2.FROM_ID)

Полагаю, это не сработало, потому что я не включил свои фильтры для TYPE_ID AND FROM_CLASS_ID в подзапрос. Я слишком буквально воспринял совет «не публикуйте весь код». Извините, что не предоставил достаточно информации для тех, кто пытался ответить. Это работает сейчас, хотя. Спасибо за ответы.

0 голосов
/ 23 марта 2019

Я думаю, что вы хотите коррелированный подзапрос:

e.MISC_EVENT_ID = (select max(me2.MISC_EVENT_ID) 

                   from VASDW.MISC_EVENT me2
                   where me2.FROM_ID = me.FROM_ID and

                         me2.CREATE_TS >= '2019-01-01 and
                         me2.CREATE_TS < add_days(current date, 1)
                 )
...