在与另一个表连接的表中按组排序

时间:2012-09-04 06:09:19

标签: asp.net sql vb.net

我有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语句,并且无法找到类似的问题。 任何建议都非常感谢。提前谢谢。

5 个答案:

答案 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)
相关问题