SQL Server获取最新条目会返回错误的结果。我错过了什么?

时间:2016-06-09 11:24:16

标签: sql-server

我对SQL Server查询/函数有一种奇怪的行为。

我有一个包含3列的表(实际上有更多列,但这3个与此任务相关)。列为FileIdUserIdTimeCreated。一个用户可以多次创建相同的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值。当发生这种情况时,它总是两行而不是更多。

TimeCreatedDateTimeOffset(7)UserId是字符串以及FileId。也许重要的是要知道......

是否有人解释为何会发生这种情况?

3 个答案:

答案 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)

出现问题的是你的内部选择会返回多个值。它会为表格中的每个组合TimeCreatedFileId返回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