У меня есть запрос, в котором я пытаюсь найти строки, которые содержат максимальное значение в определенном поле. Я пробовал max (имя_поля), но он возвращает все строки.Функция max() с неработающими соединениями - DB2 SQL
SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
GROUP BY CMNT.VER_NBR, CMNT.SEQ_NBR, CMNT.ID, CMNT.CMNT_TXT
выход
+----------------+------+---------+
| CMNT.ID | SEQ | VERSION |
+----------------+------+---------+
133340000101373 2 1
133340000101374 2 1
133340000101373 3 1
133340000101374 3 1
133340000101373 4 1
133340000101374 4 1
133340000101373 1 2
133340000101374 1 2
133340000101373 1 3
133340000101374 1 3
133340000101373 2 3
133340000101374 2 3
Но, ожидаемые ряды (макс (SEQ_NBR)):
+----------------+------+---------+
| CMNT.ID | SEQ | VERSION |
+----------------+------+---------+
133340000101373 4 1
133340000101374 4 1
Однако я изменил запрос, как показано ниже, которая возвращает выше ожидаемого результата.
SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
CMNT.SEQ_NBR = (select max(CMNT.SEQ_NBR) from
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124)
Из-за подзапроса этот запрос поменялся дольше. Есть ли способ сократить/улучшить этот запрос?
Вероятно, не имеет отношения к СОЕДИНЕНИЯМ. Первые группы запросов более чем желательны для осуществления желаемого агрегата; тот же результат был бы, если бы были удалены все критерии JOIN и был запрошен только файл CMNT. Второй запрос не является синтаксически правильным, и этот запрос не может привести к * правильным * результатам, даже если скалярный подзадача был как-то закодирован, но правильно как предикат ANDed. Кажется вероятным, данные выборок просто появляются, чтобы получить ожидаемый результат; эффективно, а не намеренно; Отсутствие GROUP BY, подсегмент выбирает MAX (SEQ_NBR) независимо от чего-либо еще. – CRPence