我对SQL Server查询/函数有一种奇怪的行为。
我有一个包含3列的表(实际上有更多列,但这3个与此任务相关)。列为FileId
,UserId
和TimeCreated
。一个用户可以多次创建相同的FileId
,我想知道,这是最新创建的文件。
我正在使用这个WHERE
子句:
WHERE TimeCreated IN (SELECT MAX(TimeCreated)
FROM table
GROUP BY FileId, UserId)
在我看来,这应该是正确的,但对于某些群组,它会返回多行,即使TimeCreated
不同。
以下是一个结果:
TimeCreated | UserId | FileId
------------------------------------------------------
2016-01-18 00:00:00.000 | UserA | FileA
2016-01-18 06:00:00:000 | UserA | FileA
但它应该只返回'2016-01-18 06:00:00:000'作为TimeCreated
值的行。
我不明白出了什么问题,因为有更多的条目,其中有UserA(作为UserId)和FileA(作为FileId)但是不同的TimeCreated值但它只返回这两行(所以在某种程度上,它是非常有效的),就像我说的,对于一些组来说没关系,但有时它返回两行具有相同的UserId和FileId但不同的TimeCreated值。当发生这种情况时,它总是两行而不是更多。
TimeCreated
是DateTimeOffset(7)
,UserId
是字符串以及FileId
。也许重要的是要知道......
是否有人解释为何会发生这种情况?
答案 0 :(得分:5)
您应该使用以下语法:
;WITH CTE as
(
SELECT
*,
row_number() over (partition by FileId, UserId ORDER BY TimeCreated DESC)rn
FROM <table>
)
SELECT * FROM CTE
WHERE rn = 1
答案 1 :(得分:2)
出现问题的是你的内部选择会返回多个值。它会为表格中的每个组合TimeCreated
和FileId
返回UserID
的最大值。
解决这个问题的一种方法是:
...
FROM table t1
INNER JOIN
(
select FileId, UserId, max(TimeCreated) as maxTimeCreated
from table
group by FileId, UserId)
)
t2 ON t1.TimeCreated = t2.maxTimeCreatedAND t1.UserId = t2.USerId AND T1.FileId = t2.FileId
但是,如果您发布表格结构和所需结果,有人可能会向您展示更好的方法。
答案 2 :(得分:0)
您没有通过UserId加入子查询,因此较低的TimeCreated可能对应于另一个用户文件。
RenderImageWithDPI