首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用MS获取带有组的Max列?

如何使用MS获取带有组的Max列?
EN

Stack Overflow用户
提问于 2016-12-07 09:14:12
回答 4查看 52关注 0票数 2

我想要查询的是“获取用户最后的致命日志”。当我查询下面的语句时,它只返回"username“和"logDate”字段,但我也希望得到这个“logDate”对应的行(我指logid,logdata);

代码语言:javascript
运行
复制
SELECT user.username, MAX(log.logDate) FROM user 
INNER JOIN log ON user.userid = log.userid
WHERE log.logtype = 'fatal'
GROUP BY user.username

我的用户桌;

代码语言:javascript
运行
复制
userid  username   
-----------------
1       robert
2       ronaldo

日志表;

代码语言:javascript
运行
复制
logid  logDate                    logtype  userid  logdata
----------------------------------------------------------
1      2016-11-28 19:37:53.000    fatal    1       data
2      2016-11-28 22:37:53.000    fatal    1       data
3      2016-11-28 12:37:53.000    fatal    2       data
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-07 09:16:49

我将使用CROSS APPLY(向Log表添加适当索引的首选方法)来完成此操作。

代码语言:javascript
运行
复制
SELECT *
FROM   [USER] u
       CROSS apply (SELECT TOP 1 *
                    FROM   log l
                    WHERE  u.userid = l.userid
                           AND l.logtype = 'fatal'
                    ORDER  BY l.logDate DESC) cs

如果log表非常大,那么在日志表上创建一个Non Clustered Index以提高性能

代码语言:javascript
运行
复制
CREATE NONCLUSTERED INDEX NIX_Log_logtype_userid
ON [log] (logtype,userid)
INCLUDE (logid,logDate,logdata)

另一种使用ROW_NUMBER的方法

代码语言:javascript
运行
复制
SELECT *
FROM   (SELECT *,
               Row_number()OVER(partition BY [USER].username ORDER BY log.logDate DESC) AS rn
        FROM   [USER]
               INNER JOIN log
                       ON [USER].userid = log.userid
        WHERE  log.logtype = 'fatal') A
WHERE  rn = 1 

使用ROW_NUMBERTOP 1 with ties的另一种方法

代码语言:javascript
运行
复制
SELECT TOP 1 WITH ties *
FROM   [USER]
       INNER JOIN log
               ON [USER].userid = log.userid
WHERE  log.logtype = 'fatal'
ORDER  BY Row_number()OVER(partition BY [USER].username ORDER BY log.logDate DESC) 

注释:所有查询都会导致两个表中的所有列选择所需的列

票数 4
EN

Stack Overflow用户

发布于 2016-12-07 09:17:55

一个快速的选项是在子查询中获取最大日志日期。这样,您可以从用户表中选择所需的任何字段,而不必在外部查询中进行聚合。唯一的问题是,您的日志日期不需要重复。如果它是一个日期时间,那么这是不可能的,但是如果它只是一个日期字段,您可能会有重复的。值得一查。

代码语言:javascript
运行
复制
SELECT
     u.username
    ,u.logdate
    ,u.logid
    ,u.logdata
FROM user u
INNER JOIN (SELECT 
                userid
                ,MAX(logdate) MaxLog 
            FROM log 
            WHERE logtype = 'fatal' 
            GROUP BY userid) l
    ON u.userid = l.userid
    AND u.logdate = l.MaxLog
票数 2
EN

Stack Overflow用户

发布于 2016-12-07 09:19:28

您可以为此使用ROW_NUMBER

代码语言:javascript
运行
复制
SELECT user.username, 
       log.logid, log.logtype, log.logDate, log.logdata
FROM (
   SELECT user.username, 
          log.logid, log.logtype, log.logDate, log.logdata,
          ROW_NUMBER() OVER (PARTITION BY user.username 
                             ORDER BY log.logDate DESC) AS rn
   FROM user 
   INNER JOIN log ON user.userid = log.userid
   WHERE log.logtype = 'fatal') AS t
WHERE t.rn = 1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41013429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档