2013-06-18 4 views
6

나는 PostgreSQL을 버전 9.1.9 사용하고 있습니다 :dense_rank() order by 및 nulls - 순위의 맨 아래로 처리하는 방법?

select version(); 
"PostgreSQL 9.1.9 on armv7l-unknown-linux-gnueabihf, 
compiled by gcc (Debian 4.6.3-14+rpi1) 4.6.3, 32-bit" 

을 나는 하나의 널 (NULL) bigint 열 (라는)가 (Test라는) 간단한 테이블이 있습니다. 표는 다음과 같은 데이터가 있습니다

NULL 
1 
2 

가 지금은 조밀 한 순위를 (따라서 dense_rank() 기능을 사용하여) 만들려면을 그래서 나는 다음과 같은 쿼리를 수행

select "A", dense_rank() over (order by "A" desc) from public."Test" 

이 반환을 :

NULL,1 
2,2 
1,3 

흥미롭게도 SQL Server 2008 R2에서 정확히 동일한 것을 설정하고 동일한 쿼리를 실행하면 결과는 다음과 같이 반환됩니다.

2,1 
1,2 
NULL,3 

그래서, 나는하지만, 더 실제적으로, 내가 원하는 것은 SQL Server 동작하므로, 가 어떻게 PostgreSQL을이 순위의 하위로 널을 처리 할 수 ​​올바른 누가에 관심이 있어요?

(어떤 값보다 작은 같은 즉 정렬 NULLS)

은 내가 DENSE_RANK 페이지에이를 발견하지만,이 기능에 대해 구체적으로 이야기되지 않지만, 아마도 그것은 단서는?

참고 : SQL 표준은 존중 NULLS를 정의 또는 납, 지연, FIRST_VALUE, LAST_VALUE 및 nth_value에 대한 NULLS 옵션 을 무시합니다. PostgreSQL에 구현 된 은 아닙니다. 동작은 항상 표준의 기본값 인 RESPECT NULLS와 동일합니다. 마찬가지로 nth_value에 대한 표준 FROM FIRST 또는 FROM LAST 옵션은 구현되지 않습니다. 기본 FROM FIRST 동작 만 지원됩니다. (당신은 주문에 의해 순서를 반대로 지난 FROM의 결과를 얻을 수 있습니다.)

답변

7

NULL 값이 정렬되는 방법을 수정하기 위해 NULLS LAST 절을 사용합니다. 합니까 정확히 당신을 위해 무엇을 질문 : 윈도우 함수에 대한 ORDER BY어디서나에 대한 다만

SELECT "A", dense_rank() OVER (ORDER BY "A" DESC NULLS LAST) 
FROM public."Test"

.

Postgres는 올바른 기능을합니다. NULL은 오름차순으로 정렬되기 때문에 순서가 바뀌면 기본적으로 먼저 정렬되어야합니다.

관련 :

+0

큰 - 정말 고마워! (나는 postgresql이 올바른 방법 일 것이라고 생각했다 :-)) – kmp