这个问题使我不安。
我有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>
我还删除了所有敏感数据-因此请不要担心输出与上面包含的表的片段不同。
任何帮助将不胜感激。 谢谢
答案 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
如果查询未产生预期的输出,请通知我。