2014-08-29 6 views
6

다음 결과 집합은 몇 개의 조인과 공용체가있는 SQL 쿼리에서 파생됩니다. SQL 쿼리는 이미 날짜 및 게임의 행을 그룹화합니다. 날짜 열로 분할 된 게임에서 시도 횟수를 설명하는 열이 필요합니다.PostgreSQL 창 기능 : row_number() (파티션 col order by col2)

Username Game  ID Date 

johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 100 7/22/14 1:52 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 121 7/22/14 1:56 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 130 7/22/14 1:59 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 200 7/22/14 2:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 
johndoe1 Game_1 210 7/22/14 3:54 AM 

내가 날짜와 게임을 기반으로하는 게임의 경우의 수를 원하는 이후 파티션 내에서 행하지만 완전히 정확하지를 열거 다음 SQL 쿼리를했습니다. 이 경우 johndoe1은 Game_1에서 시간 소인으로 5 번 분할되었습니다.

이 쿼리 반환 모든 포인터가 큰 도움이 될 것

select * 
, row_number() over (partition by ct."date" order by ct."date") as "Attempts" 
from csv_temp as ct 

Username Game  ID Date    Attempts (Desired Attempts col.) 

johndoe1 Game_1 100 7/22/14 1:52 AM 1   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 2   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 3   1 
johndoe1 Game_1 100 7/22/14 1:52 AM 4   1 
johndoe1 Game_1 121 7/22/14 1:56 AM 1   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 2   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 3   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 4   2 
johndoe1 Game_1 121 7/22/14 1:56 AM 5   2 
johndoe1 Game_1 130 7/22/14 1:59 AM 1   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 2   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 3   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 4   3 
johndoe1 Game_1 130 7/22/14 1:59 AM 5   3 
johndoe1 Game_1 200 7/22/14 2:54 AM 1   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 2   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 3   4 
johndoe1 Game_1 200 7/22/14 2:54 AM 4   4 
johndoe1 Game_1 210 7/22/14 3:54 AM 1   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 2   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 3   5 
johndoe1 Game_1 210 7/22/14 3:54 AM 4   5 

아래 결과 집합. a_horse_with_no_name로 표시된 바와 같이

+3

아마도 도움이 될 것입니다. http://java.dzone.com/articles/difference-between-rownumber –

+0

원하는 결과를 보면'(Desired Attempts col.) '그룹의 행 사이의 유일한 차이점은 '시도 '열. 아마도'Username, Game, ID'로 그룹화하고'count (1)'를 추가하여 시도 횟수를 얻고'row_number() '를 추가하여'(Desired Attempts col.)'를 얻을 수있을 것입니다. – Jakub

답변

16

는 이러한 요구에 대해 우리는 dense_rank() 달리 필요 파티션 값을 변경할 때, 다음의 윈도우 기능은 1

편집 에서 group by를 다시 시작 할 필드 유사하게 partition by을 고려 row_number()rank() 또는 dense_rank()은 할당 된 번호를 반복합니다. row_number()은 파티션의 각 행마다 다른 값이어야합니다. rank()dense_rank()의 차이는 후자가 숫자를 건너 뛰지 않는다는 것입니다. 쿼리 시도에 대한

:

dense_rank() over (partition by Username, Game order by ct."date") as "Attempts" 

당신은에 의해 분할하지 않으며, 그런데, 같은 분야에 의해 순서; 그것이 필요하다면 단지 주문만으로 충분할 것입니다. 여기 없어요.

+3

예제에서와 같이 사용자 이름/게임의 조합이 하나만있는 경우 각 행은 명령문과 다른 row_number를 갖게됩니다 (row_number()는 중복 된 숫자를 생성하지 않습니다). 'dense_rank() 이상이어야합니다 (사용자 이름 별 파티션, 게임 날짜 별 날짜 ")' –

+1

@a_horse_with_no_name Oh dear quite correct - 파티셔닝에 집중했습니다. 고맙습니다. –

+0

"partition by"절이 둘 이상의 열을 받아 들일 수 있고 i가 잘못 파티션 된 것을 상상할만큼 창조적이지 않았습니다. 당신 덕분에! – user1951677