2017-12-12 16 views
0

한 사용자 : 사용자 및 비디오PostgreSQL의 쿼리 만 나는 두 테이블이 항목

  • 동영상 : 동영상 ID, 사용자 ID, 타임 스탬프
  • 사용자 : 아이디, 타임 스탬프 내가 원하는

을 오늘 생성 된 모든 동영상을 나열하려면 사용자 항목을 1로 제한하고 싶습니다. 따라서 한 사용자의 동영상이 최대 검색어에서 반환됩니다. 동일한 사용자가 여러 동영상을 반환하는 것을 원하지 않습니다. 이 응답을 JSON 형식으로 사용하겠습니다.

어떻게이 목적으로 SQL을 작성할 수 있습니까?

감사합니다.

+0

왜'users' 테이블에 타임 스탬프 열이 있습니까? –

+0

그것은 해당 사용자의 생성 날짜를 보여주는 생성 타임 스탬프입니다. –

+0

아래 답변을 시도했습니다. –

답변

1

userID 두 테이블을 결합한 다음 사용자의 파티션에 ROW_NUMBER을 사용하여 각 사용자에 대한 최신 비디오를 찾습니다.

SELECT videoID, userID, timestamp 
FROM 
(
    SELECT u.userID, v.videoID, v.timestamp, 
     ROW_NUMBER() OVER (PARTITION BY u.userID ORDER BY v.timestamp DESC) rn 
    FROM users u 
    INNER JOIN videos v 
     ON u.userID = v.userId 
) t 
WHERE t.rn = 1; 
1

당신은 max 윈도 기능을 고려할 수 있습니다 :

with videoz as (
    select 
    v.*, 
    max (v.timestamp) over (partition by v.user_id) as max_timestamp 
    from 
    videos v 
    join users u on v.userid = u.user_id 
) 
select 
    videoid, userid, timestamp 
from videoz 
were 
    timestamp = max_timestamp 

은 이론적으로, 이것은 당신이 기대할 수만큼이나 좋은 O (n)이이어야한다. row_number을 사용하는 것의 단점은 동일한 타임 스탬프를 가진 동일한 사용자에 대해 두 개의 비디오가있는 경우이 두 행을 반환한다는 것입니다.이 경우 팀의 솔루션이 선호 될 것입니다. 둘 중 하나를 선택하십시오.

select distinct on (v.userid) v.* 
from videos v 
where timestamp >= current_date 
order by v.userid; 

참고 :

+0

실제로 행 번호가 동점을 감지 할 수 없기 때문에 내 솔루션에도 문제가 있습니다. 순위가 좋을거야, +1. –

0

포스트 그레스는이를위한 가장 간단한 방법 인 distinct on을 제공합니다 당신이에서 어떤 열을 요구하지 않기 때문에 당신은 사용자 테이블이 필요하지 않습니다. 또한 데이터에 미래 날짜/시간이 없다고 가정합니다.

+0

가능성은 낮지 만 아마 그렇지 않을 수도 있습니다.하지만 내부 사용자 조인은 이론적으로 비디오 테이블에서 반환되는 레코드 수를 제한 할 수 있습니다. 당신의 요점은 잘 받아 들여지고 사실 일 것입니다. – Hambone