我想要查询的是“获取用户最后的致命日志”。当我查询下面的语句时,它只返回"username“和"logDate”字段,但我也希望得到这个“logDate”对应的行(我指logid,logdata);
SELECT user.username, MAX(log.logDate) FROM user
INNER JOIN log ON user.userid = log.userid
WHERE log.logtype = 'fatal'
GROUP BY user.username我的用户桌;
userid username
-----------------
1 robert
2 ronaldo日志表;
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发布于 2016-12-07 09:16:49
我将使用CROSS APPLY(向Log表添加适当索引的首选方法)来完成此操作。
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以提高性能
CREATE NONCLUSTERED INDEX NIX_Log_logtype_userid
ON [log] (logtype,userid)
INCLUDE (logid,logDate,logdata)另一种使用ROW_NUMBER的方法
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_NUMBER和TOP 1 with ties的另一种方法
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) 注释:所有查询都会导致两个表中的所有列选择所需的列
发布于 2016-12-07 09:17:55
一个快速的选项是在子查询中获取最大日志日期。这样,您可以从用户表中选择所需的任何字段,而不必在外部查询中进行聚合。唯一的问题是,您的日志日期不需要重复。如果它是一个日期时间,那么这是不可能的,但是如果它只是一个日期字段,您可能会有重复的。值得一查。
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发布于 2016-12-07 09:19:28
您可以为此使用ROW_NUMBER:
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 = 1https://stackoverflow.com/questions/41013429
复制相似问题