不识别 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'
)
但这只是一个猜测...
下午好
我正在使用 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'
)
但这只是一个猜测...