0

我有 2 个表,其中一个是查找表,另一个是事务日志。

Lookup table User: UserId, Name and Department.
Transaction log table EntryLog:  LogID, UserId, TimeIn, TimeOut

我正在尝试检索报告以查看用户表中所有用户(唯一)的最后一次看到时间(TimeIn 或 TimeOut)。

我尝试了以下查询,但没有看到工作:

SELECT DISTINCT (A.UserID), TimeIn, TimeOut, B.Name, B.Department FROM EntryLog A
  INNER JOIN User B ON B.UserId = A.UserId
  ORDER BY TimeOut DESC, TimeIn DESC

不知何故,结果似乎从事务日志中检索了所有记录(包括重复的 UserId)。我不擅长 SQL 语句,正在寻找类似的问题而无济于事。非常感谢任何建议。先感谢您。

4

5 回答 5

1

Distinct不仅过滤掉UserId所有重复的行。

你想GROUP BY UserID改为。如果您使用的是 SQL-Server >= 2005,则可以使用带有 ROW_NUMBER 函数的 CTE:

WITH CTE AS
(
   SELECT A.UserID, TimeIn, TimeOut, B.Name, B.Department 
      , ROW_NUMBER()OVER(PARTITION BY UserID Order By Timeout DESC, TimeIn Desc)AS RN
   FROM EntryLog A INNER JOIN User B ON B.UserId = A.UserId 
)
SELECT * FROM CTE WHERE RN = 1
于 2012-09-04T06:18:38.573 回答
0

您应该使用 GROUP BY 按用户 ID 和 HAVING 子句对 TimeIn 和 TimeOut 进行分组。

于 2012-09-04T06:15:45.173 回答
0

试试这个,

SELECT  a.UserID, b.TimeIN, b.TimeOut,
        a.Name, a.Department
FROM    Usertable a
            INNER JOIN logTable b
                ON a.userID = b.userid
            INNER JOIN
            (
                SELECT      UserID, MAX(TimeIN) as maxTimeIN
                FROM        logTable
                GROUP BY    UserID
            ) c ON b.userID = c.userID AND
                   b.TimeIN = c.MaxTimeIN
于 2012-09-04T06:16:33.663 回答
0

您可以使用GROUP BY子句而不是使用,DISTINCT因为DISTINCT将删除重复的行而不是重复的列。你可以这样做:

SELECT A.UserID, TimeIn, TimeOut, B.Name, B.Department FROM EntryLog A
INNER JOIN User B ON B.UserId = A.UserId
GROUP BY A.UserID, TimeIn, TimeOut, B.Name, B.Department
ORDER BY TimeOut DESC, TimeIn DESC
于 2012-09-04T06:16:45.237 回答
0

尝试这个

SELECT A.UserID, TimeIn, TimeOut, B.Name, B.Department 
FROM EntryLog A INNER JOIN User B ON B.UserId = A.UserId 
where A.LogID in (select MAX(LogID) from EntryLog group by USERID)
于 2012-09-04T06:19:19.617 回答