SQL查询删除这些重复项

时间:2018-05-31 13:44:36

标签: sql duplicates tableau

所以我没有SQL经验,但我没有资源用于识别重复项。

问题:SER_NO(序列#)可以显示在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

此外,我在Tableau的自定义SQL查询功能中执行此操作... ...在不了解SQL或基本语法的情况下...似乎不喜欢任何花哨的技巧。也许它确实...我不知道......但我所得到的只是使用其他人的脚本的错误。它似乎对它想要看到的语法非常具体。

1 个答案:

答案 0 :(得分:0)

假设您选择的所有其他字段(除日期外)也是重复的,您可以使用min(event_ts)或{{{ 1}}取决于你想看到的内容:

max(event_ts)

如果您的重复记录的每一行都有不同的FAC_PROD_FAM_CD,SER_NO,DISC_AREA_ID等值......那么您必须得到更好的信息。您可以使用相关子查询作为一个选项:

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

这里,在子查询中,我们得到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)给定所有相同的WHERE条件,然后我们通过event_id限制主查询。