MSSQL从分组结果中选择最高值

时间:2018-10-11 11:58:35

标签: sql sql-server sql-server-2014

这个问题使我不安。

我有2张桌子:

第一个是user_account_log

id  username    invoiceid   log_datetime            log_type    log_entry
1   testuser    0       2006-03-30 17:38:14.0000000 Suspend     true 
2   testuser    0       2006-03-30 17:38:30.0000000 Un-Suspend  true 
3   testuser    0       2006-03-31 15:19:42.0000000 Suspend     true 
4   testuser2   0       2006-03-31 17:14:15.0000000 Un-Suspend  true 
5   testuser2   0       2006-03-31 17:15:18.0000000 Suspend     true 
6   testuser3   0       2006-04-06 16:13:59.0000000 Suspend     true 

用户帐户:

username    accountname datestart           dateend
testuser    product1    2000-08-30 23:59:59.0000000 2000-12-29 21:04:33.0000000
testuser2   product2    2000-08-28 14:10:03.0000000 2002-01-21 13:07:05.0000000
testuser3   product1    2000-08-28 16:17:06.0000000 2002-06-30 23:59:59.0000000

作为较大查询的一部分-我有一个带以下代码的with语句:

SELECT MAX(log_datetime) AS logtime, 
max(id) AS ID,
user_account_log.username, 
ua.accountname,     
log_type,
ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as temp
FROM user_account_log
left outer join user_account ua on ua.username = user_account_log.username
where ua.dateend is null
GROUP BY user_account_log.username, 
log_datetime,
ua.accountname, 
log_type

但是它没有输出我需要的东西-当前结果集如下:

logtime             ID  username    accountname     log_type    temp
2011-11-17 15:18:23.0000000 34736   testuser    product1        Un-Suspend  61
2011-11-17 15:18:23.0000000 34736   testuser    product2        Un-Suspend  62
2012-12-10 10:35:08.0000000 35607   testuser    product1        Suspend     63
2012-12-10 10:35:08.0000000 35607   testuser    product2        Suspend     64
2013-09-04 17:09:09.0000000 36587   testuser    product1        Un-Suspend  65
2013-09-04 17:09:09.0000000 36587   testuser    product2        Un-Suspend  66

我需要做的是获取最新的日志(使用logtime或ID)-但我需要确保将其按所有产品分组-因此预期结果将受到限制,

logtime             ID  username    accountname     log_type    temp
2013-09-04 17:09:09.0000000 36587   testuser    product1        Un-Suspend  65
2013-09-04 17:09:09.0000000 36587   testuser    product2        Un-Suspend  66

我确定此选择中显然缺少一些东西-但我一天中大部分时间都在使用各种结果,所有这些看起来都不像我需要的结果集。< / p>

我还删除了所有敏感数据-因此请不要担心输出与上面包含的表的片段不同。

任何帮助将不胜感激。 谢谢

3 个答案:

答案 0 :(得分:1)

我设法找到了一个解决方案(尽管它尚未完全写入脚本的主体中),该解决方案为每组行选择了最高ID:

select t.*
from (select *,
             max(id) over (partition by username) as max1,
             max(log_datetime) over (partition by username) as max2
      from user_account_log
     ) t
     where t.id = t.max1

感谢2位发帖人的回答,尽管都没有答案-这有助于我指出正确的方向

答案 1 :(得分:0)

尝试以下

select * from 
(SELECT *,
ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as rn
FROM user_account_log
left outer join user_account ua on ua.username = user_account_log.username
where ua.dateend is null)a where rn=1

答案 2 :(得分:0)

我不确定我是否正确理解了您的要求,但是根据您的解释和理解,我想您可以在从GROUP BY子句中删除“ log_datetime”之后,尝试执行查询'ROW_NUMBER'不直接使用,那么我认为您在此选择中不需要(如果需要,则可以随时添加它)。如果有帮助,请尝试执行以下SELECT语句。

SELECT
    MAX(log_datetime) AS logtime, 
    MAX(id) AS ID,
    user_account_log.username, 
    ua.accountname,     
    log_type
    --,ROW_NUMBER() OVER(PARTITION BY user_account_log.username order by log_datetime) as temp
FROM user_account_log
LEFT OUTER JOIN user_account ua ON ua.username = user_account_log.username
WHERE ua.dateend IS NULL
GROUP BY
    user_account_log.username, 
    --log_datetime,
    ua.accountname, 
    log_type

如果查询未产生预期的输出,请通知我。