2014-01-03 3 views
-1

У меня есть простой запрос, который меня смущает. Похоже, функция MAX не работает, но я уверен, что я просто делаю что-то неправильно.Функция MAX работает не так, как ожидалось

Как написано ниже, я получаю 2 записи, а не только одну. Каждая запись имеет разные значения FHUK01, поэтому я включил функцию MAX, чтобы вытащить большую из двух, но она, похоже, не работает.

Любая помощь была бы принята с благодарностью.

SELECT MAX(CRPDTA.F4981.FHUK01) AS "UID", 
    CRPDTA.F4981.FHSHPN, 
    CRPDTA.F4981.FHRTDQ, 
    CRPDTA.F4981.FHUOM, 
    CRPDTA.F4981.FHCGC1 
FROM CRPDTA.f4981 
WHERE crpdta.f4981.FHSHPN=4577085 
AND CRPDTA.F4981.FHCGC1 = 'DIS' 
GROUP BY CRPDTA.F4981.FHUK01, 
    CRPDTA.F4981.FHSHPN, 
    CRPDTA.F4981.FHRTDQ, 
    CRPDTA.F4981.FHUOM, 
    CRPDTA.F4981.FHCGC1; 

Пример вывода запроса:

UID  FHSHPN FHRTDQ FHUOM FHCGC1 

7502828 4577085 630000 MI DIS 

7502827 4577085 0  DIS 
+0

Я должен спросить. В чем заключаются ваши имена в столбце и таблице? – Zane

+1

@ Zane Знаете, если их взломают. – Kermit

+2

@ Zane Они "CRP" -y. :) – dg99

ответ

2

Вы GROUPing BY столбец, который вы пытаетесь MAX:

GROUP BY CRPDTA.F4981.FHUK01 

Вы, вероятно, не хотят, чтобы сделать это.

+0

, я удалил эту строку и все еще получаю 2 записи. это странно. :/ – user1521068

+0

Это потому, что вы группируете некоторые вещи. Таким образом, вы получите MAX для каждой группы «group by». В частности, вы получите строку для каждой комбинации значений FHRTDQ и FHUOM, которые существуют в БД (где FHSHPN = 4577085 и FHCGC1 = 'DIS'). – dg99

+1

нет. он группируется по нескольким столбцам, в которых есть разные данные, которые создают несколько наборов группировок. – swasheck

0

Как сказал swasheck в своем посте, поскольку в вашем запросе имеется несколько наборов группировок, вы получите только несколько строк.

Если вы хотите получить данные, соответствующие максимальному FHUK01. Возможно, что вам нужно что-то вроде:

Select CRPDTA.F4981.FHUK01, 
     CRPDTA.F4981.FHSHPN, 
     CRPDTA.F4981.FHRTDQ, 
     CRPDTA.F4981.FHUOM, 
     CRPDTA.F4981.FHCGC1 
     from crpdata.f4981 
     where f4981.fhuk01= (SELECT MAX(CRPDTA.F4981.FHUK01) 
          FROM CRPDTA.f4981 
          WHERE crpdta.f4981.FHSHPN=4577085 
          AND CRPDTA.F4981.FHCGC1 = 'DIS'); 
0

попробовать этот запрос:

SELECT MAX(CRPDTA.F4981.FHUK01) AS "UID", 
    CRPDTA.F4981.FHSHPN, 
    CRPDTA.F4981.FHRTDQ, 
    CRPDTA.F4981.FHUOM, 
    CRPDTA.F4981.FHCGC1 
FROM CRPDTA.f4981 
WHERE crpdta.f4981.FHSHPN=4577085 
AND CRPDTA.F4981.FHCGC1 = 'DIS' 
GROUP BY 
    CRPDTA.F4981.FHSHPN, 
    CRPDTA.F4981.FHRTDQ, 
    CRPDTA.F4981.FHUOM, 
    CRPDTA.F4981.FHCGC1; 
0

Этот запрос даст вам строку, имеющую максимальное значение FHUK01 для данного FHSHPN и FHCGC1.

with tab(FHUK01, FHSHPN, FHRTDQ, FHUOM, FHCGC1, RN) as 
(select CRPDTA.F4981.FHUK01, 
     CRPDTA.F4981.FHSHPN, 
     CRPDTA.F4981.FHRTDQ, 
     CRPDTA.F4981.FHUOM, 
     CRPDTA.F4981.FHCGC1, 
     row_number() over (partition by crpdta.f4981.FHSHPN, CRPDTA.F4981.FHCGC1 order by CRPDTA.F4981.FHUK01 desc) rn 
    from CRPDTA.f4981 
    where crpdta.f4981.FHSHPN=4577085 
    AND CRPDTA.F4981.FHCGC1 = 'DIS') 
select FHUK01, FHSHPN, FHRTDQ, FHUOM, FHCGC1 
    from tab 
where rn = 1; 
+0

мой оригинальный отправленный запрос на самом деле был только внутренней частью запроса слияния, который я пытался создать.этот метод работал для меня. бесконечно благодарен. :) – user1521068

+0

Пожалуйста, отметьте это, чтобы закрыть эту дискуссию. – San

0

мой первоначальный пост был только внутренней частью запроса на слияние, который я пытался построить. Я, наконец, получил его на работу, используя предложение Сан ...

MERGE INTO CRPDTA.F4941 DST 
USING (WITH TAB (RSSHPN,RSRSSN,RSDSTN,RSUMD1,RSADDJ,FHUK01,FHSHPN,FHRTDQ,FHUOM,FHCGC1,RN) AS 
(SELECT CRPDTA.F4941.RSSHPN, 
CRPDTA.F4941.RSRSSN, 
CRPDTA.F4941.RSDSTN, 
CRPDTA.F4941.RSUMD1, 
CRPDTA.F4941.RSADDJ, 
CRPDTA.F4981.FHUK01, 
CRPDTA.F4981.FHSHPN, 
CRPDTA.F4981.FHRTDQ, 
CRPDTA.F4981.FHUOM, 
CRPDTA.F4981.FHCGC1, 
ROW_NUMBER() OVER (PARTITION BY CRPDTA.F4941.RSSHPN, CRPDTA.F4941.RSRSSN, CRPDTA.F4981.FHSHPN, CRPDTA.F4981.FHCGC1 ORDER BY CRPDTA.F4981.FHUK01 DESC) RN 
FROM CRPDTA.F4941 
INNER JOIN CRPDTA.F4981 
ON CRPDTA.F4941.RSSHPN = CRPDTA.F4981.FHSHPN 
WHERE CRPDTA.F4941.RSDSTN = 0 
AND CRPDTA.F4941.RSADDJ > 110365 
AND CRPDTA.F4981.FHCGC1 = 'DIS') 

SELECT * FROM TAB 
WHERE RN = 1) SRC 
ON (DST.RSSHPN = SRC.FHSHPN) 
WHEN MATCHED THEN UPDATE 
SET DST.RSDSTN = ROUND(SRC.FHRTDQ/10000,0), DST.RSUMD1 = SRC.FHUOM; 
Смежные вопросы