SQL子查询问题

SQL子查询问题,sql,sql-server,Sql,Sql Server,我有以下SQL SELECT Seq.UserSessionSequenceID, Usr.SessionGuid, Usr.UserSessionID, Usr.SiteID, Seq.Timestamp, Seq.UrlTitle, Seq.Url FROM tblUserSession Usr INNER JOIN tblUserSessionSequence Seq ON Usr.UserSession

我有以下SQL

SELECT
    Seq.UserSessionSequenceID, 
    Usr.SessionGuid, 
    Usr.UserSessionID,
    Usr.SiteID, 
    Seq.Timestamp, 
    Seq.UrlTitle, 
    Seq.Url
FROM
    tblUserSession Usr
INNER JOIN  
    tblUserSessionSequence Seq ON Usr.UserSessionID = Seq.UserSessionID
WHERE     
    (Usr.Timestamp > DATEADD(mi, -45, GETDATE())) AND (Usr.SiteID = 15)
ORDER BY Usr.Timestamp DESC

非常简单的东西。tblUserSessionSequence中本质上有多个UserSessionID行。我只想返回具有唯一UserSessionID的最新(前1)行。如何操作?

您可以使用窗口功能为每个用户的行编号,并仅选择行编号为1的行

SELECT
    UserSessionSequenceID, 
    SessionGuid, 
    UserSessionID,
    SiteID, 
    Timestamp, 
    UrlTitle, 
    Url
FROM (
    SELECT
        Seq.UserSessionSequenceID, 
        Usr.SessionGuid, 
        Usr.UserSessionID,
        Usr.SiteID, 
        Usr.Timestamp AS UsrTimestamp, 
        Seq.Timestamp, 
        Seq.UrlTitle, 
        Seq.Url,
        ROW_NUMBER() OVER (PARTITION BY Usr.UserSessionID
                           ORDER BY Seq.UserSessionSequenceID DESC) AS rn
    FROM
        tblUserSession Usr
    INNER JOIN  
        tblUserSessionSequence Seq ON Usr.UserSessionID = Seq.UserSessionID
    WHERE     
        (Usr.Timestamp > DATEADD(mi, -45, GETDATE())) AND (Usr.SiteID = 15)
) T1
WHERE rn = 1
ORDER BY UsrTimestamp DESC

如果您希望在查询中只返回一行(即带有最新时间戳的ID),只需更改

SELECT

如果您希望为每个UserSessionID获取一行,但希望确保获取具有最新
时间戳的一行,那么这就稍微复杂一些

你可以这样做:

SELECT  
    Seq.UserSessionSequenceID,   
    Usr.SessionGuid,   
    Usr.UserSessionID,  
    Usr.SiteID,   
    Seq.Timestamp,   
    Seq.UrlTitle,   
    Seq.Url  
FROM  
    tblUserSession Usr  
INNER JOIN    
    (SELECT 
        UserSessionSequenceID, 
        UserSessionID, 
        Timestamp, 
        UrlTitle, 
        Url, 
        ROW_NUMBER() over (PARTITION BY UserSessionID ORDER BY UserSessionSequenceID) AS nbr

    FROM tblUserSessionSequence) Seq ON Usr.UserSessionID = Seq.UserSessionID AND Seq.nbr = 0
WHERE       
    (Usr.Timestamp > DATEADD(mi, -45, GETDATE())) AND (Usr.SiteID = 15)  
ORDER BY Usr.Timestamp DESC 

最新的UserSessionID可能与最高的UserSessionSequenceId重复请允许我再指定一点。我仍然希望在总体结果中有多行。只需TblUserSessionSequenced中的第一个唯一UserSessionID,当我尝试使用您提供的上述代码运行它时,就会出现此错误:Msg 1033,级别15,状态1,第21行ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或FOR XML。@seo20:尝试删除子选择中的order by,看看是否有帮助。我已经更新了我的答案。仍然收到错误:Msg 102,15级,状态1,第9行“')附近的语法不正确。Msg 102,级别15,状态1,第27行“T1”附近的语法不正确。@seo20:缺少逗号。几乎所有works都希望UserSessionID具有TBluserSessionSequenceId中最高的UserSessionSequenceID。@seo20:您可以通过更改子选择中的
order by
子句来获得任意顺序。我已经更新了答案,给出了你想要的答案。
SELECT  
    Seq.UserSessionSequenceID,   
    Usr.SessionGuid,   
    Usr.UserSessionID,  
    Usr.SiteID,   
    Seq.Timestamp,   
    Seq.UrlTitle,   
    Seq.Url  
FROM  
    tblUserSession Usr  
INNER JOIN    
    (SELECT 
        UserSessionSequenceID, 
        UserSessionID, 
        Timestamp, 
        UrlTitle, 
        Url, 
        ROW_NUMBER() over (PARTITION BY UserSessionID ORDER BY UserSessionSequenceID) AS nbr

    FROM tblUserSessionSequence) Seq ON Usr.UserSessionID = Seq.UserSessionID AND Seq.nbr = 0
WHERE       
    (Usr.Timestamp > DATEADD(mi, -45, GETDATE())) AND (Usr.SiteID = 15)  
ORDER BY Usr.Timestamp DESC