SQL-запрос для удаления этих дубликатов - PullRequest
0 голосов
/ 31 мая 2018

Таким образом, у меня нет опыта работы с SQL, но у меня нет ресурсов для идентификации дубликатов.

Проблема: SER_NO (serial #) может отображаться в 2 разные даты (EVENT_TS), и я толькохочу увидеть первое вхождение SER_NO.

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

Я пошел по маршруту SELECT DISTINCT, и это не помогает ... Мне нужно определить, происходит ли SER_NO более одного раза, а затем, если это произойдет, я хочу сохранитьпервое вхождение (MIN DATE).

SELECT
EVENT_TS, EVENT_NO, FAC_PROD_FAM_CD, SER_NO, DISC_AREA_ID, DISC_AREA_DESC, 
QUALITY_VELOCITY, CMPNT_SERIAL_NO, PROTOTYPE_IND, EXT_CPY_STAT
FROM ABUS_DW.V_BIQ_R8_QWB_EVENTS
WHERE
(FAC_PROD_FAM_CD='ACOM' OR FAC_PROD_FAM_CD='SCOM' OR FAC_PROD_FAM_CD='LAP' OR 
FAC_PROD_FAM_CD='RM' OR FAC_PROD_FAM_CD='SCRD') 
AND (DISC_AREA_ID='400' OR DISC_AREA_ID='450')
AND PROTOTYPE_IND<>'Y' AND EXT_CPY_STAT<>'D' 
AND EVENT_TS>=<Parameters.Start Date> ORDER BY EVENT_TS

Кроме того, я делаю это с помощью функции пользовательских запросов SQL в Tableau ... которая ... ничего не зная о SQL или базовом синтаксисе ... кажется, что неткак любые модные трюки.Возможно, это так ... Я не знаю ... Но все, что я получил, - это ошибки, использующие сценарии других людей.Кажется, он очень специфичен в синтаксисе, который он хочет видеть.

1 Ответ

0 голосов
/ 31 мая 2018

Предполагая, что все остальные поля, которые вы выбираете (кроме даты), также дублируются, вы можете использовать некоторую агрегацию в запросе, чтобы объединить выходные записи, используя либо min(event_ts), либо max(event_ts) в зависимости от того, чтовы хотите увидеть:

SELECT MIN(EVENT_TS) as EVENT_TS
    ,EVENT_NO
    ,FAC_PROD_FAM_CD
    ,SER_NO
    ,DISC_AREA_ID
    ,DISC_AREA_DESC
    ,QUALITY_VELOCITY
    ,CMPNT_SERIAL_NO
    ,PROTOTYPE_IND
    ,EXT_CPY_STAT
FROM ABUS_DW.V_BIQ_R8_QWB_EVENTS
WHERE FAC_PROD_FAM_CD IN ('ACOM', 'SCOM', 'LAP', 'RM', 'SCRD')
    AND DISC_AREA_ID IN ('400','450')       
    AND PROTOTYPE_IND <> 'Y'
    AND EXT_CPY_STAT <> 'D' 
    AND EVENT_TS >= <Parameters.Start DATE>
GROUP BY
    EVENT_NO
    ,FAC_PROD_FAM_CD
    ,SER_NO
    ,DISC_AREA_ID
    ,DISC_AREA_DESC
    ,QUALITY_VELOCITY
    ,CMPNT_SERIAL_NO
    ,PROTOTYPE_IND
    ,EXT_CPY_STAT
ORDER BY EVENT_TS

Если в каждой строке ваших дубликатов записей есть разные значения для FAC_PROD_FAM_CD, SER_NO, DISC_AREA_ID и т. д., то вам придется стать более любопытным.Вы можете использовать коррелированный подзапрос как один из вариантов:

SELECT EVENT_TS
    ,EVENT_NO
    ,FAC_PROD_FAM_CD
    ,SER_NO
    ,DISC_AREA_ID
    ,DISC_AREA_DESC
    ,QUALITY_VELOCITY
    ,CMPNT_SERIAL_NO
    ,PROTOTYPE_IND
    ,EXT_CPY_STAT
FROM ABUS_DW.V_BIQ_R8_QWB_EVENTS AS t1
WHERE FAC_PROD_FAM_CD IN ('ACOM', 'SCOM', 'LAP', 'RM', 'SCRD')
    AND DISC_AREA_ID IN ('400','450')       
    AND PROTOTYPE_IND <> 'Y'
    AND EXT_CPY_STAT <> 'D' 
    AND EVENT_TS = 
        (
            SELECT MIN(EVENT_TS) 
            FROM ABUS_DW.V_BIQ_R8_QWB_EVENTS
            WHERE FAC_PROD_FAM_CD IN ('ACOM', 'SCOM', 'LAP', 'RM', 'SCRD')
                AND DISC_AREA_ID IN ('400','450')       
                AND PROTOTYPE_IND <> 'Y'
                AND EXT_CPY_STAT <> 'D' 
                AND EVENT_TS >= <Parameters.Start DATE>
                AND t1.EVENT_ID = EVENT_ID
        )
ORDER BY EVENT_TS;

Здесь, в подзапросе, мы получаем min(event_ts) для event_id при всех тех же условиях WHERE, а затем мы ограничиваем основной запросчто min(event_id).

...