2016-11-09 2 views
0

일기 표가 있다고 가정합니다. 일기의 각 항목은 user_identry_date입니다. 범위가 user_id 인 경우 지정된 날짜보다 늦게 첫 번째 항목을 선택하고 싶습니다.모든 행에 대해 기준을 만족하는 첫 번째 항목을 선택하십시오.

그래서

user_id | entry_date 
-------------------- 
    1  | 2016-11-09 20:00:00 
    2  | 2016-11-09 20:00:00 
    1  | 2016-11-09 21:00:00 
    1  | 2016-11-09 22:00:00 
    5  | 2016-11-10 20:00:00 

와 나는

SELECT user_id,entry_date FROM entries 
WHERE entries.user_id BETWEEN 10 AND 20 
AND TAKE_FIRST(entries.entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss')) 

과 같이 쓸 수 상상 (TAKE_FIRST() 내가 모르는 무엇에 대한 자리 표시 자입니다.)

그러면 결과는입니다.

user_id | entry_date 
-------------------- 
    1  | 2016-11-09 21:00:00 
    5  | 2016-11-10 20:00:00 

어떻게하면됩니까? ROW_NUMBER()

답변

1

: 범위의 각 user_id를 들어

SELECT user_id,entry_date 
FROM (
    SELECT user_id,entry_date, 
      ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY entry_date) as rnk 
    FROM entries 
    WHERE entries.user_id BETWEEN 10 AND 20 
     AND entries.entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss') 
    ) 
WHERE rnk = 1 
+0

성능에 문제가있는 것으로 보입니다. 지정된 날짜보다 큰 모든 타임 스탬프가 선택되고 그 중에서 1 개만 선택됩니다. 성능을 향상시킬 수 있습니까? – kasperhj

2
SELECT user_id,MIN(entry_date) FROM entries 
WHERE entries.user_id BETWEEN 10 AND 20 
AND entry_date >= to_timestamp('2016-11-09 20:30:00', 'yyyy-mm-dd hh24:mi:ss')) 
GROUP BY user_id 

당신의 선택보다 최소 날짜보다 찾습니다. entries 테이블에서 추가 데이터가 필요한 경우에는 작동하지 않지만 가장 간단한 솔루션이어야합니다.

+0

좋은 눈은 창 함수없이 해결할 수 있습니다. +1. 그것이 더 많은 칼럼을 원한다면, 그는 그렇게하지 않을 것입니다 : – sagi

+0

@sagi - 그는 더 많은 열을 원한다면 잘 할 것입니다, 그것은'keep (dense_rank first/last order by entry_date)'이 가능한 것입니다! – mathguy

+0

예, 그가 창 함수를 사용한다면 OP와 같이 OP가 어떻게 보이는지 보시겠습니까? ... 저는 방금 첫 번째 항목에서 더 많은 열이 필요할 경우 코드를 그대로 사용하지 않을 것이라고 말했습니다. 작업. @mathguy – sagi