我有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
不知何故,结果似乎从事务Log中检索了所有记录(包括重复的UserId)。我不擅长SQL语句,并且无法找到类似的问题。 任何建议都非常感谢。提前谢谢。
答案 0 :(得分: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
答案 1 :(得分:0)
您应该使用GROUP BY按用户ID进行分组,使用带有MAX的HAVING子句进行TimeIn和TimeOut分组。
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分: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)