【问题标题】:SQL query to remove these duplicates删除这些重复项的 SQL 查询
【发布时间】:2023-03-17 11:32:01
【问题描述】:

所以我没有使用 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

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

【问题讨论】:

    标签: sql duplicates tableau-api


    【解决方案1】:

    假设您选择的所有其他字段(除了日期)也是重复的,您可以在查询中使用一些聚合来压缩输出记录,使用 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;
    

    在这里,在子查询中,在所有相同的 WHERE 条件下,我们得到 min(event_ts) 的 min(event_ts),然后我们通过 min(event_id) 限制主查询。

    【讨论】:

    • JNevill...您的脚本有效,但它仍然给了我所有的副本...去这里查看脚本的结果:community.tableau.com/message/771709#771709 LEFFLER:我无法让您的脚本运行... Tableau 总是给出错误“缺少右括号”,不管这实际上是错误。所以我无法产生任何结果。就像我说的,Tableau 似乎对其允许的语法非常敏感……显然没有捷径,只有基础
    猜你喜欢
    • 2019-12-11
    • 2014-07-03
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多