2

我有下表:

RowId, UserId, Date
1, 1, 1/1/01
2, 1, 2/1/01
3, 2, 5/1/01
4, 1, 3/1/01
5, 2, 9/1/01

我想根据日期和时间获取最新记录,UserId但作为以下查询的一部分(由于某种原因,我无法更改此查询,因为这是由工具自动生成的,但我可以编写以 AND 开头的任何内容。 .):

SELECT RowId, UserId, Date
FROM MyTable
WHERE 1 = 1
AND ( 

// everything which needs to be done goes here . . .

)

我尝试过类似的查询,但出现错误:

当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。

编辑:数据库是 Sql Server 2008

4

4 回答 4

3

你可以使用一个NOT EXISTS条件:

SELECT RowId, UserId, Date
FROM MyTable
WHERE 1 = 1
AND NOT EXISTS (
  SELECT *
  FROM MyTable AS t
  WHERE t.UserId = MyTable.UserId
    AND t.Date > MyTable.Date
)
;

请注意,如果用户有多行具有相同的最新Date值,则查询将返回所有此类条目。如有必要,您可以稍微修改子查询的条件以确保只返回一行:

  WHERE t.UserId = MyTable.UserId
    AND (t.Date > MyTable.Date
      OR t.Date = MyTable.Date AND t.RowId > MyTable.RowId
    )

Date在上述条件下,如果同一用户存在两行或多行相同的行,RowId则返回值较大的行。

于 2013-11-10T22:00:40.757 回答
1

假设您有能力修改AND子句中的任何内容,如果您使用的是 TSQL,则可以执行这样的查询

SELECT RowId, UserId, [Date]
FROM @myTable
WHERE 1 = 1
AND ( 
    RowId IN (
            SELECT D.RowId
            FROM (
                SELECT DISTINCT MAX(RowId) AS RowId, UserId, MAX([Date]) AS [Date]
                FROM @myTable
                GROUP BY UserId
        ) AS D
    )
)
于 2013-11-10T21:45:22.723 回答
1

假设这RowID是一个身份列:

SELECT t1.RowId, t1.UserId, t1.Date
FROM MyTable t1
WHERE 1 = 1
AND t1.RowID IN ( 

    SELECT TOP 1 t2.RowID 
    FROM MyTable t2
    WHERE  t1.UserId = t2.UserId
    AND    t2.Date = (SELECT MAX(t3.Date) FROM MyTable t3
                      WHERE t2.UserID = t3.UserId)

)

Demo

于 2013-11-10T21:51:29.660 回答
1

尝试:

SELECT RowId, UserId, Date
FROM MyTable
WHERE 1 = 1
AND EXISTS
(SELECT 1
 FROM (SELECT UserId, MAX(Date) MaxDate
       FROM MyTable
       GROUP BY UserId) m
 WHERE m.UserId = MyTable.UserId and m.MaxDate = MyTable.Date)

SQLFiddle在这里

于 2013-11-10T21:45:07.037 回答