【发布时间】:2016-03-16 18:34:59
【问题描述】:
我需要找到每个人最后一次登录的记录。这适用于 T-SQL
SELECT *
FROM
(
SELECT lh.*, ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY DateCreated DESC) AS RowNumber
FROM LoginHistory lh
) lhp
where lhp.RowNumber = 1
但由于 DocumentDb 减少了feature set,我不知道如何处理。
我认为这需要作为存储过程来解决,但我也不知道如何构建它。循环多个异步调用? (甚至不知道该怎么做。)下载所有记录并仅使用 JS 过滤它们?
如何翻译?
更新:示例输出
PARTITION BY 类似于 GROUP BY,但它不是聚合结果,而是将记录视为一种范围。所以
SELECT lh.*, ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY DateCreated DESC) AS RowNumber
FROM LoginHistory lh
会返回类似的东西
UserId DateCreated RowNumber
1 2015-12-10 22:44:03 1
1 2015-12-10 13:35:12 2
1 2015-12-09 18:52:25 3
2 2015-12-10 20:53:13 1
2 2015-12-10 08:12:41 2
它基本上说,“对于给定的 UserId,按 DateCreated 对这些记录进行排序”。
然后我只需在外部查询中选择 RowNumber = 1,我就有每个用户的最新记录。
我的问题使用了 SQL 2015+ 语法,但也可以使用 SQL 2005 之前的语法,这可以通过 this 之类的东西来完成:
Select Date, User, Status, Notes
from [SOMETABLE]
inner join
(
Select max(Date) as LatestDate, [User]
from [SOMETABLE]
Group by User
) SubMax
on [SOMETABLE].Date = SubMax.LatestDate
and [SOMETABLE].User = SubMax.User
很遗憾,DocumentDb 也不支持 GroupBy。
【问题讨论】:
-
我不熟悉 OVER ... PARTITION BY。你能提供一个示例输出吗?我是 documentdb-lumenize 的作者,它是一个在 DocumentDB 中作为存储过程运行的聚合库。您指定 groupBy 甚至多维立方体,所以我怀疑它可以满足您的需求,但我需要这个例子来确定。
-
感谢您的更新。我现在了解到您正在寻找最新的。我将在下面发布答案。
-
我在下面的回答有帮助吗?你走哪条路?
标签: azure azure-cosmosdb