2011-01-13 3 views
0

SQL 쿼리 문에서 부문 :내가 돌아 두 개의 질의 배정 밀도 값의 단일 열이

(SELECT scale 
    FROM (SELECT title, 
       scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 1) 

을 ... 그리고 :

(SELECT scale 
    FROM (SELECT scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 2) 

나는 (첫 번째 쿼리를 선택하는 것을 시도하고있다 Q1)을 두 번째 쿼리 (Q2)로 나눈 값입니다. 즉, (Q1부터 Row1)/(Q2에서 Row1). 그리고 나머지 행을 계속했습니다.

SELECT ((SELECT scale 
      FROM (SELECT title, 
         scale, 
         dense_rank() OVER (PARTITION BY title 
               ORDER BY scale ASC) AS r 
        FROM signatures) t 
      WHERE r = 1) 

/

(SELECT scale 
    FROM (SELECT scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 2) 
) 

을하지만, 운이 없었을 :

나는 노력했다. 누구나이 방법을 볼 수 있습니까? 두 개의 쿼리를 개별적으로 보내고 루프를 통해 실행하고 요소를 나눌 수는 있지만 세미 크기의 레코드 세트에서는 작동하지 않습니다.

또한 중요하지 않지만 PostgreSQL을 사용하고 있습니다.

+1

당신은 넥타이를 다루는 경우'DENSE_RANK'가 같은 값을 반환한다는 것을 알고 있습니까? 예를 들어 세 번째 인스턴스를 두 번째 장소에 묶어두면 부서에 슬픔이 생길 수 있습니다. –

+0

@OMG. 좋아,하지만 쿼리를 별도로 실행하면 정확한 결과를 얻을 수 있습니다. 이 둘을 하나의 문장으로 나눌 수 있습니까? – Brett

+0

로컬 임시 테이블을 정의하여 각 쿼리에 대한 결과 열을 저장 한 다음 그 값을 곱할 수 있습니까? – Brett

답변

1

두 세트를 가져 와서 결합하려고 시도하는 대신 LEAD 윈도우 기능을 사용하려고한다고 생각합니다. 이렇게하면 같은 창에서 다른 행에 대한 참조를 만들 수 있습니다 (일치하는 partition by). 뭔가 같은 여기

select title, scale/next_scale 
from (select title, scale, 
       lead(scale) over(partition by title order by scale asc) as next_scale, 
       row_number() over(partition by title order by scale asc) as agg_row 
     from signatures 
    ) agg 
where agg_row = 1; 

, lead(scale) 동일한 윈도우에 출력 순서, 즉 다음 가장 규모가되도록 다음 행에서 scale 열에서 값을 취한다. 우리는 여전히 row_number()을 투영하고 필터를 적용하여 각 창에서 첫 번째 행에 대한 출력 행, 즉 각 제목에 대해 가장 작은 크기의 행을 얻습니다.

+0

놀라운! 완벽하게 작동합니다. 이전에 LEAD 함수를 사용하지 않았기 때문에 새로운 것을 배웠습니다.) 쿼리가 두 개를 실행하고 결합하는 것보다 훨씬 빠릅니다. 많은 많은 감사합니다! – Brett

0

SQL에 나누기 위해 각 열의 그림을 알 수있는 방법을 SQL에 제공해야합니다. 이 시도 : 여러 개의 동일한 스케일 값으로 끝날 경우

OMG는 주석으로
SELECT first.title, (first.scale/second.scale) ratio 
     FROM 
      (SELECT scale, title 
       FROM (SELECT title, scale, 
          dense_rank() OVER 
          (PARTITION BY title ORDER BY scale ASC) AS r 
         FROM signatures) t 
      WHERE r = 1) first 
INNER JOIN 
      (SELECT scale, title 
       FROM (SELECT title, scale, 
          dense_rank() OVER 
          (PARTITION BY title ORDER BY scale ASC) AS r 
         FROM signatures) t 
      WHERE r = 2) second 
     ON first.title = second.title 

는, DENSE_RANK는 당신에게 문제를 제공 할 수 있습니다. 로직에 적합한 경우 각 서브 쿼리를 제목 당 하나의 행으로 제한하거나 외부 쿼리에서 SELECT DISTINCT를 지정하여 중복이 정확히 중복되도록 할 수 있습니다.

관련 문제