[SQL] MySQL의 GroupWise에 MAX ()는 예기치 않은 결과를 반환
SQLMySQL의 GroupWise에 MAX ()는 예기치 않은 결과를 반환
표 : 대출
Loan_no Amount SSS_no Loan_date
7 700.00 0104849222 2010-01-03
8 200.00 0104849222 2010-02-28
9 300.00 0119611199 2010-11-18
10 150.00 3317131410 2012-11-28
11 600.00 0104849222 2011-01-03
14 175.00 3317131410 2012-12-05
15 260.00 3317131410 2013-02-08
16 230.00 0104849222 2013-03-06
17 265.00 0119611199 2011-04-30
18 455.00 3317131410 2013-03-10
원하는 결과 :
나는 최근 대출이 떨어져 쓸모가 검색 할 것 각 사람에 의해 (자신의 SSS 번호로 식별). 그만큼 결과는 다음과 같아야합니다
Loan_no Amount SSS_no Loan_date
16 230.00 0104849222 2013-03-06
17 265.00 0119611199 2011-04-30
18 455.00 3317131410 2013-03-10
QUERY # 1 사용 :
고르다 * 대출 FROM GROUP BY SSS_no ORDER BY Loan_date DESC
MYSQL의 결과
Loan_no Amount SSS_no Loan_date
10 150.00 3317131410 2012-11-28
9 300.00 0119611199 2010-11-18
7 700.00 0104849222 2010-01-03
QUERY # 2를 사용 :
SELECT Loan_no, 양, SSS_no, 최대 (Loan_date) 대출 FROM GROUP BY SSS_no
MYSQL의 결과
Loan_no Amount SSS_no Loan_date
7 700.00 0104849222 2013-03-06
9 300.00 0119611199 2011-04-30
10 150.00 3317131410 2013-03-10
내 문제와 캔 누구의 도움 나? 감사.
해결법
-
==============================
1.대신이 시도 :
대신이 시도 :
SELECT l1.* FROM loan AS l1 INNER JOIN ( SELECT SSS_no, MAX(Loan_date) LatestDate FROM loan GROUP BY SSS_no ) AS l2 ON l1.SSS_no = l2.SSS_no AND l1.loan_date = l2.LatestDate;
이것은 당신을 줄 것이다 :
| LOAN_NO | AMOUNT | SSS_NO | LOAN_DATE | ---------------------------------------------- | 16 | 230 | 104849222 | 2013-03-06 | | 17 | 265 | 119611199 | 2011-04-30 | | 18 | 455 | 3317131410 | 2013-03-10 |
-
==============================
2.당신이 SELECT 목록에 하나의 컬럼에 GROUP BY를 사용하고 모든 컬럼에있는 집계 함수를 사용하지 않기 때문에 예기치 않은 결과를 얻고있는 이유입니다.
당신이 SELECT 목록에 하나의 컬럼에 GROUP BY를 사용하고 모든 컬럼에있는 집계 함수를 사용하지 않기 때문에 예기치 않은 결과를 얻고있는 이유입니다.
MySQL은 당신이하지 GROUP BY를 수행하거나 SELECT 목록에있는 모든 항목을 집계 할 때 예기치 않은 결과가 발생할 수 있습니다 기능에 의해 그룹의 확장을 사용합니다. (GROUP BY에 대한 MySQL의 확장 참조)
MySQL의 문서에서 :
올바른 결과를 반환해야 할 수있는 유일한 방법은 제대로 집계 및 GROUP BY에 쿼리를 변경하는 것입니다.
이 비슷한 일을 사용할 수 있도록 :
select l1.loan_no, l1.amount, l1.SSS_no, l1.loan_date from loan l1 inner join ( select SSS_no, max(loan_date) Loan_date from loan group by SSS_no ) l2 on l1.SSS_no = l2.SSS_no and l1.loan_date = l2.loan_date
데모와 SQL 바이올린을 참조하십시오
이 구현은 하위 쿼리는 각 SSS_no에 대한 최대 (loan_date)을 얻을 수 있습니다. 이 하위 쿼리는 다음 각 SSS_no에 대한 올바른 결과를 얻을 수 있음을 보장 할 SSS_no 및 최대 loan_date 모두 테이블에 다시 합류한다.
-
==============================
3.MySQL의 참조는이 문제를 해결하기 위해 여러 가지 방법을 제안합니다. 가장 간단한 하위 쿼리입니다 :
MySQL의 참조는이 문제를 해결하기 위해 여러 가지 방법을 제안합니다. 가장 간단한 하위 쿼리입니다 :
SELECT * FROM loan l1 WHERE loan_date=(SELECT MAX(l2.loan_date) FROM loan l2 WHERE l1.sss_no = l2.sss_no);
하위 쿼리의이 유형은 잠재적으로 나쁜 성능을 감안할 때, 그들은 또한이 (본질적 마흐무드 가말의 답변을) 가입 사용하는 것이 좋습니다 :
SELECT l1.loan_no, l1.amount, l1.sss_no, l1.loan_date FROM loan l1 JOIN ( SELECT loan_no, MAX(loan_date) AS loan_date FROM loan GROUP BY sss_no) AS l2 ON l1.loan_date = l2.loan_date AND l1.sss_no = l2.sss_no;
세 번째 옵션은 다음과 같습니다
SELECT l1.loan_no, l1.amount, l1.sss_no, l1.loan_date FROM loan l1 LEFT JOIN loan l2 ON l1.sss_no = l2.sss_no AND l1.loan_date < l2.loan_date WHERE l2.sss_no IS NULL;
왼쪽은 l1.loan_date가 최대 값에있을 때 L2 행 값이 NULL이 될 수 있도록, 나중에 l2.loan_date이 있음을 기준으로 작품을 가입하세요.
이들은 모두 동일한 출력을해야하지만, 가능성이 성능에 차이가 있습니다.
from https://stackoverflow.com/questions/15613187/mysql-groupwise-max-returns-unexpected-results by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 2005 SQL Server를 사용하여 별도의 행에 쉼표로 구분 된 값을 확장합니까? (0) | 2020.05.29 |
---|---|
[SQL] SSIS를 사용하면 파일에 테이블 데이터의 XML 표현을 추출 (0) | 2020.05.29 |
[SQL] MySQL의 빈 IN 절 매개 변수 목록 (0) | 2020.05.28 |
[SQL] 어떻게 두 번째로 높은 급여와 직원을 찾는 방법은? (0) | 2020.05.28 |
[SQL] SQL 문에서 사용하는 R 스크립트 문자열 변수 전달 (0) | 2020.05.28 |