不识别 ROW_NUMBER() 函数 OVER (PARTITION BY

Does not recognize ROW_NUMBER() function OVER (PARTITION BY

下午好

我正在使用 ROW_NUMBER() 函数 OVER (PARTITION BY, 仅带来字段串联的唯一值,但是,当 运行 查询时,partition by 有效,因为它告诉我我指示的字段重复的次数,但想要只从出现的列表中取出一条记录,它不会接受它,所以只把那些值为 1 的记录放在我的条件中,它会继续给我带来整个数据集。

 SELECT DISTINCT 
    C1_ID_ALERTA,
    C2_NOMBRE_USUARIO,
    C3_BP,
    C32_AREA_BANCARIA,
    C4_CONTRATO,
    C41_CENTRO_FINANCIERO,
    C5_CAMPO,
    C6_VALOR_ANTERIOR,
    C7_VALOR_ACTUAL,
    C8_FECHA_MODIFICACION,
    C9_HORA_MODIFICACION,
    C10_TIPO_LOG,
    enum
FROM (
    SELECT T1.*,ROW_NUMBER() OVER (PARTITION BY T1.C1_ID_ALERTA ORDER BY T1.C1_ID_ALERTA  DESC)as ENUM 
        FROM (
            SELECT 
            area_bancaria||contrato||valor_anterior||valor_actual C1_ID_ALERTA,
            nombre_usuario                         C2_NOMBRE_USUARIO,
            bp                                     C3_BP,
            area_bancaria                          C32_AREA_BANCARIA,
            contrato                               C4_CONTRATO,
            cenfinancierodes                       C41_CENTRO_FINANCIERO,
            campo                                  C5_CAMPO,
            valor_anterior                         C6_VALOR_ANTERIOR,
            valor_actual                           C7_VALOR_ACTUAL,
            fecha_modificacion                     C8_FECHA_MODIFICACION,
            hora_modificacion                      C9_HORA_MODIFICACION,
            tipo_log                               C10_TIPO_LOG
        FROM (SELECT  *
            FROM CAM_TBL_ALERTA_CONCENTRADO conc
               INNER JOIN  IBM_I2.I2_CONTRATOS cont
                 ON conc.contrato = LTRIM(cont.nocont,'0')  
                 AND cont.institucion = conc.area_bancaria        
                   WHERE   
                        TIPO_LOG='LOG BP' 
                        AND OPERACION='2'  
                )              
            )T1
        ) T2      
                 WHERE  ENUM=1
                 AND C1_ID_ALERTA IS NOT NULL 
                    AND C10_TIPO_LOG='LOG BP'  
                    AND C5_CAMPO NOT IN ('GIRO_CNBV','BIRTHDT','D_F_ESCRITURA','CLAVE_COL',
                                        'CONSNUMBER','XSEXF','ADDRNUMBER','NAME_ORG1','NAME_ORG2','NAME_ORG3','TAXNUM',
                                        'RELTYP','ADDR_TYPE','NAME_LAST','NAME_LST2','NAMEMIDDLE','NAME_FIRST',
                                        'STREET','POST_CODE1','HOUSE_NUM1','LOCALIDAD','REGION','ROOMNUMBER',
                                        'TOWN','CLAVE_COL','ADDR_TYPE','RELTYP')
                    OR c5_campo='SMTP_ADDR'
                    OR c5_campo='TEL_NUMBER'

它没有标记任何错误。

Condition precedence rules 说 AND 在 OR 之前求值。如此有效,你有:

WHERE
(
  ENUM=1
  AND C1_ID_ALERTA IS NOT NULL 
  AND C10_TIPO_LOG='LOG BP'  
  AND C5_CAMPO NOT IN (...)
)
OR c5_campo='SMTP_ADDR'
OR c5_campo='TEL_NUMBER'

如果最后两个条件中的任何一个为真,那么无论 ENUM 值如何,都会包括该结果,因为 OR。

您可能需要一些其他的评估顺序,因此您应该添加括号以获得您需要的顺序;可能:

WHERE ENUM=1
AND C1_ID_ALERTA IS NOT NULL 
AND
(
  (
    C10_TIPO_LOG='LOG BP'  
    AND C5_CAMPO NOT IN (...)
  )
  OR c5_campo='SMTP_ADDR'
  OR c5_campo='TEL_NUMBER'
)

但这只是一个猜测...