Sql server 表中的聚合数据-TSQL

Sql server 表中的聚合数据-TSQL,sql-server,tsql,common-table-expression,Sql Server,Tsql,Common Table Expression,我有两个表,User和UserAccess 表-用户: 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 2

我有两个表,
User
UserAccess

表-
用户

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          
将有许多
用户
记录,包括或不包括
用户访问
记录
User\u ID
User
表中的PK,是
UserAccess
表中的FK

我必须编写一个通用查询来为每个客户端返回一个用户记录,而不是为同一个客户端返回多个用户记录

< P> <代码>用户< /代码>最早的<代码>启动日期>代码>,如果有对应的<代码>用户访问< /代码>,它将被认为胜过一个没有<代码>用户访问< /代码>记录>

查询应仅返回
用户
表中的2条记录,如下所示:

  • 用户#3,因为它具有最早的
    Start_日期
    UserAccess
    记录
  • 用户#5具有最早的
    StartDate
    ,但没有
    UserAccess
    记录,因此应选择用户#7,因为它具有最早日期的用户访问记录
希望我能解释清楚

提前谢谢

问候


Ally

这个查询对你有用吗

;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;

我尝试过CTE检查子表上的计数,但无法得到写入结果谢谢你做得对,我用了不同的方法,但你的方法更好谢谢你,这也很有效。我们用了不同的方法,但你的方法更好