programing

첫번째결과만선택하세요

powerit 2023. 10. 5. 23:34
반응형

첫번째결과만선택하세요

저는 다음과 같은 질문을 작성했습니다.

SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
              FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 
ORDER BY TOTALS.TOTAL DESC;

하지만 그것은 나에게 틀린 답을 주고 있지만, 만약 내가 그것을 제거한다면.ROWNUM <= 1절, 그러면 정답은 결과 집합의 맨 위에 있습니다.

그렇다면 이 쿼리에서 무엇을 변경하여 정답을 도출할 수 있습니까?

고마워, 알렉스.

편집: 쿼리가 결과 집합의 첫 번째 결과만 반환하기를 원한다는 것을 잊었습니다.

ROWNUM필터는 정렬 전에 적용됩니다.당신이 해야 할 일은 다음과 같습니다.

SELECT * FROM (
  SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
  FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
                  FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
  WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO 
  ORDER BY TOTALS.TOTAL DESC
)
WHERE ROWNUM <= 1 

다른 외부 쿼리에서 행 번호를 감습니다.

select * from (
SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO ORDER BY TOTALS.TOTAL DESC)
where ROWNUM <= 1;

이를 찾은 MySQL 사용자의 경우 ROW_NUMBER()를 사용하여 다음과 같은 결과를 얻을 수 있습니다.

WITH ranked AS (    
        SELECT
        ROW_NUMBER() OVER (
        PARTITION BY CLIENTNO
            ORDER BY TOTALS.TOTALS
        ) ROWNUM,
       CLIENT.CLIENTNO,
       .
       . )
SELECT * FROM ranked
    WHERE ROWNUM <=1

가지 유용한 정보: https://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function 및 https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

언급URL : https://stackoverflow.com/questions/7834081/select-first-result-only

반응형