2016-06-14 1 views
-1

두 테이블, UserUserAccess이 있습니다.테이블의 집계 데이터 - TSQL

표 - User :

USER_ID , Client_ID , Start_Date 
1   123  2015-06-30 
2   123  2015-06-25 
3   123  2015-06-20 
5   888  2016-02-10 
6   888  2016-02-15 
7   888  2016-02-12 

표 - UserAccess은 :

USER_ACCESS_ID USER_ID 
    10   1   
    11   2   
    12   3 
    13   6 
    14   7   

또는 UserAccess 기록없이 많은 Users 기록이있을 것입니다. User_IDUser 테이블의 PK이고테이블의 FK입니다.

대신 클라이언트마다 하나의 사용자 레코드를 반환하는 일반 쿼리를 작성해야합니다. 동일한 클라이언트에 대해 둘 이상의 사용자 레코드가 있습니다.

쿼리는 User에서 단지 2 레코드를 반환해야합니다 ..

초기 Start_DateUser을 선택하고, 해당 UserAccess와 기록이있는 경우, 그것은 UserAccess 기록하지 않고 하나 이상의 승자가 고려 될 것입니다 테이블

  • 같은 사용자 # 3는 초기 Start_Date 기록 UserAccess
  • 사용자 # 5는 초기을 가지고있다으로이지만 UserAccess 레코드가 없으므로 가장 빠른 날짜의 사용자 액세스 레코드가 있으므로 사용자 # 7을 선택해야합니다.

희망을 설명 할 수있었습니다.

미리 감사드립니다.

감사

앨리

+0

내가 자식 테이블에 수를 확인하여 CTE를 시도했지만 쓰기 결과를 잘 해냈어 – Ally

답변

0

윌 당신을 위해 해당 쿼리를 사용할 수 있습니까? 이것은 또한 일을 당신이 감사

;WITH Users as (
    SELECT u.*, a.USER_ACCESS_ID 
    , RANK() OVER(PARTITION BY Client_ID 
      ORDER BY CASE WHEN a.USER_ID is Null 
        Then 1 ELSE 0 END, u.Start_Date) as ToPick 
    FROM tbl_User as u 
    LEFT JOIN tbl_UserAccess as a 
    ON u.USER_ID = a.USER_ID 
) 
SELECT USER_ID , Client_ID , Start_Date, USER_ACCESS_ID 
FROM Users 
WHERE ToPick = 1; 
+0

감사를 얻을 수없는, 나는 그것을 다른 방식을했지만 당신의 방법은 – Ally

+0

더 좋았다 . 우리는 다른 방법을 시도했지만 당신의 방법은 더 좋습니다. – Ally

+0

답변으로 표시 하시겠습니까? –