Sql server SQL Server:选择最新时间

Sql server SQL Server:选择最新时间,sql-server,distinct,Sql Server,Distinct,我有一个很好的查询,但有一个问题,它显示了我不想要的其他数据 数据是每个用户名的最新数据 以下是查询: SELECT l.USER_KEY AS id, l.USER_ID AS username, gl1.CHAR_KEY AS char_id, gl1.NAME AS charname, gl1.GATENUM AS server, CONVERT(VARCHAR(20), l.LOGINTIME, 100) AS user_time,

我有一个很好的查询,但有一个问题,它显示了我不想要的其他数据

数据是每个用户名的最新数据

以下是查询:

SELECT
    l.USER_KEY AS id,
    l.USER_ID AS username, 
    gl1.CHAR_KEY AS char_id,
    gl1.NAME AS charname,
    gl1.GATENUM AS server,
    CONVERT(VARCHAR(20), l.LOGINTIME, 100) AS user_time,
    CONVERT(VARCHAR(20), gl1.OCCUR_TIME, 100) AS char_time
FROM LOG_CONNECT201211 AS gl1
    JOIN game.dbo.CHAR_INFOR AS g --character data
        ON gl1.CHAR_KEY = g.CHAR0_KEY OR gl1.CHAR_KEY = g.CHAR1_KEY OR gl1.CHAR_KEY = g.CHAR2_KEY
    JOIN login.dbo.USER_CHECK_LOGIN AS l --login data
        ON g.USER_KEY = l.USER_KEY
    JOIN (SELECT    char_key, max(OCCUR_TIME) as mostrecent  --game logs
            FROM    LOG_CONNECT201211 
            WHERE   KIND=20 OR KIND=21
            GROUP BY char_key) AS gl2
        ON gl2.char_key = gl1.char_key and gl2.mostrecent = gl1.OCCUR_TIME
WHERE l.CHECKLOGIN = 1
ORDER BY username DESC
这将返回:

id      username    char_id name        map user_time           char_time   
------------------------------------------------------------------------------------
3667    zr5970      11002   warpath     4   Nov 15 2012  8:54AM Nov  7 2012  6:31AM
3667    zr5970      11004   bloodfines  4   Nov 15 2012  8:54AM Nov  7 2012  6:33AM
3667    zr5970      11003   hanzhou     1   Nov 15 2012  8:54AM Nov 15 2012  8:54AM
14999   yvacosta    52086   Creams      1   Nov 15 2012  8:17AM Nov 15 2012  8:17AM
23433   yurich      1911481 abal        5   Nov 15 2012  8:34AM Nov  9 2012  4:05PM
23433   yurich      1911482 yurich      5   Nov 15 2012  8:34AM Nov 15 2012  8:30AM
23433   yurich      1911483 sharmaine   5   Nov 15 2012  8:34AM Nov 15 2012  8:35AM
10967   yubiwamoi   33376   Dwina       1   Nov 15 2012  4:33AM Nov 15 2012  4:33AM
因此,数据是正确的,但我只希望每个用户名返回一行

在这个数据上,用户名返回3,其中有3个名称,但我想要的唯一名称是带有最新字符时间的名称

正确数据示例:

id      username    char_id name        map user_time           char_time   
-----------------------------------------------------------------------------------
 3667   zr5970      11003   hanzhou     1   Nov 15 2012  8:54AM Nov 15 2012  8:54AM
14999   yvacosta    52086   Creams      1   Nov 15 2012  8:17AM Nov 15 2012  8:17AM
23433   yurich      1911483 sharmaine   5   Nov 15 2012  8:34AM Nov 15 2012  8:35AM
10967   yubiwamoi   33376   Dwina       1   Nov 15 2012  4:33AM Nov 15 2012  4:33AM
请注意,我只显示了
zr5970
的最新
char\u时间的数据


请提供建议,谢谢。

首先只选择用户名和最长时间。这样您将获得正确的行数。当您有足够的数据时,您可以轻松地将其他列添加到您的查询…

使用ROW_NUMBER()

select a.USER_KEY AS id,
    l.USER_ID AS username, 
    gl1.CHAR_KEY AS char_id,
    gl1.NAME AS charname,
    gl1.GATENUM AS server,
    CONVERT(VARCHAR(20), l.LOGINTIME, 100) AS user_time,
   CONVERT(VARCHAR(20), gl1.OCCUR_TIME, 100) AS char_time
from 
(select user_key, max(occur_time) as mostrecent
from log_connect2011
WHERE   KIND=20 OR KIND=21
group by user_key) a
join LOG_CONNECT201211 AS gl1 on a.user_key = gl1.user_key and a.mostrecent =        gl1.occur_time 
JOIN game.dbo.CHAR_INFOR AS g --character data
  ON gl1.CHAR_KEY = g.CHAR0_KEY OR gl1.CHAR_KEY = g.CHAR1_KEY OR gl1.CHAR_KEY = g.CHAR2_KEY
JOIN login.dbo.USER_CHECK_LOGIN AS l --login data
  ON g.USER_KEY = l.USER_KEY
WHERE l.CHECKLOGIN = 1
ORDER BY username DESC

你好,你能详细说明一下吗?我不是很精通sql。我只是删除了我的答案。你能就你的问题抽取数据吗D请。
SELECT *
FROM
(
SELECT
    l.USER_KEY AS id,
    l.USER_ID AS username, 
    gl1.CHAR_KEY AS char_id,
    gl1.NAME AS charname,
    gl1.GATENUM AS server,
    CONVERT(VARCHAR(20), l.LOGINTIME, 100) AS user_time,
    CONVERT(VARCHAR(20), gl1.OCCUR_TIME, 100) AS char_time,
    rn = row_number() over (partition by l.USER_KEY order by gl1.OCCUR_TIME DESC)
FROM LOG_CONNECT201211 AS gl1
    JOIN game.dbo.CHAR_INFOR AS g --character data
        ON gl1.CHAR_KEY = g.CHAR0_KEY OR gl1.CHAR_KEY = g.CHAR1_KEY OR gl1.CHAR_KEY = g.CHAR2_KEY
    JOIN login.dbo.USER_CHECK_LOGIN AS l --login data
        ON g.USER_KEY = l.USER_KEY
WHERE l.CHECKLOGIN = 1
) X
WHERE rn=1
ORDER BY username DESC