복붙노트

[SQL] MySQL의 GroupWise에 MAX ()는 예기치 않은 결과를 반환

SQL

MySQL의 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. ==============================

    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. ==============================

    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. ==============================

    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이 있음을 기준으로 작품을 가입하세요.

    이들은 모두 동일한 출력을해야하지만, 가능성이 성능에 차이가 있습니다.

  4. from https://stackoverflow.com/questions/15613187/mysql-groupwise-max-returns-unexpected-results by cc-by-sa and MIT license