데이터에서 중복을 제거하고 출력을 하고 싶습니다. 0 2 1,990

by 구루비 [SQL Query] [2022.12.09 15:44:23]


사용하는 DB는 PostgreSql 입니다.

visit라는 테이블이 있습니다.

컬럼은

id, user_id, page_idx, from_id, from_visit_date, to_id, to_visit_date, create_date 등이 있습니다.

 

구조는 A라는 회원이 B의 특정 페이지에 접속을 하면 방문 기록이 쌓입니다.

A 가 B의 페이지에 방문을 하면 from_~ 컬럼에는 A의 회원 정보가 저장되고

B가 A의 페이지에 방문을 할 때는 , A 회원의 방문 데이터에 to~ 컬럼에 B의 정보가 업데이트가 됩니다.

그러니까. A라는 회원의 페이지에 from 정보는 A라는 회원이 방문했던 페이지의 회원 정보가 저장되고,
A라는 회원의 to 페이지에는 A 회원의 페이지를 방문했던 회원의 정보가 저장이 됩니다.

 

 

그리고 page_idx는 A라는 회원이 자신의 페이지를 여러개 만들 수 있습니다.

즉 1페이지, 4페이지, 5페이지... 이런식으로 임의로 페이지를 만들수 있습니다.

방문 데이터가 쌓일 경우 

id, user_id, page_idx, from_id, from_visit_date, to_id, to_visit_date, create_date 

1.     22.         1             ~~~~~~~
2.    22          3            ~~~~~~~
3.     24.         1            ~~~~~~~
4.     45.         1            ~~~~~~~

 

위와같은 식으로 데이터가 쌓이게 됩니다.

이럴 경우 22번이라는 회원 아이디는 page_idx가 1,3 번의 두 페이지에 데이터가 저장이 됩니다.

여기서 페이지를 제외하고, 회원별로 마지막으로 저장된 값을 가져올려면 어떤식으로 쿼리를 짜야할까요?

 

distinct로도 안되고, group by로 해도 안됩니다.ㅠㅠ

전체 컬럼을 대상으로 page_idx가 중복이 안되는 값 중 마지막에 저장된 값들을 모든 컬럼을 포함해서 출력을 하고 싶습니다.

 

by 우주민 [2022.12.09 17:59:31]
SELECT T1.*
FROM (
    SELECT 
      T11.*
    , ROW_NUMBER() OVER(PARTITION BY T11.user_id ORDER BY T11.create_date ) AS RN
    FROM visit T11
    ) T1
WHERE T1.RN = 1

단순하게 user_id 기준으로 최근의 값을 추출한 쿼리 입니다.


by 마농 [2022.12.10 16:05:48]

ORDER BY T11.create_date DESC

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입