需要查询以将唯一父级与不唯一的子级相关联,但可以使用MAX使其唯一

时间:2015-07-10 18:53:19

标签: sql sql-server-2008

父表(tblLog)有三个字段
用户名
时间
操作

子表(tblRole)有三个字段
用户名
角色
TransDate

我希望查询为tblLog提供三个字段,为每个UserID提供tblRole的Role信息。问题是tblRole中的UserID不是唯一的,因为该表包含历史角色。所以我需要做的只包括Transid的Max的UserID和Role。我的理解是,这是直截了当的,但我不知道该怎么做。这是我要修复的sql:

SELECT L.[ID]
      ,L.[UserID]
      ,L.[Time]
      ,L.[Action]
      ,R.Role
  FROM [TEST111].[dbo].[tblLog] as L
  Join [TEST111].[dbo].[tblRole] as R
  On  L.[UserID] = R.[UserID]

以下是来自tblRole *的示例数据:

ID	UserID	Role	TransDate
1	U001	Super	1/1/2015
2	U001	Super	2/15/2015
3	U001	Mgr	3/7/2015
4	U002	Line	2/10/2015
5	U002	Super	5/4/2015
6	U004	Mgr	4/4/2015
7	U005	Super	1/15/2015

*我之前曾说过这是来自tblLog的样本日期

2 个答案:

答案 0 :(得分:1)

您需要GROUP BY确定其值的字段,然后为您正在分析的值添加MAX聚合。

SELECT 
    L.[UserID]
    R.[Role],
    MAX(L.[TransDate]) AS [MaxDate]
FROM [TEST111].[dbo].[tblLog] L
    INNER JOIN [TEST111].[dbo].[tblRole] R
        ON L.[UserID] = R.[UserID]
GROUP BY
    L.[UserID]
    R.[Role]

答案 1 :(得分:1)

对于每个ROW_NUMBERTransDate UserId以上;With Cte As ( Select L.[ID], L.[UserID], L.[Time], L.[Action], R.[Role], Row_Number() Over (Partition By [L].[UserId] Order By [R].[TransDate] Desc) Row_Number From [TEST111].[dbo].[tblLog] as L Join [TEST111].[dbo].[tblRole] as R On L.[UserID] = R.[UserID] ) Select [Id], [UserId], [Time], [Action], [Role] From Cte Where [Row_Number] = 1 可以执行此操作:

UserId

此查询将提取每个Gruntfile.js的最新交易信息。