SQL Server:JOIN查询返回太多行

时间:2019-06-12 02:54:31

标签: sql-server join

我在连接查询中遇到麻烦,该查询返回重复的记录,希望有人可以帮助我弄清楚发生了什么事情。

我已经在这里查看了类似的帖子,并根据该信息对查询进行了一些改进,但是我并不是一个真正的SQL专家,我似乎无法获得正确的组合。

基本上我有2个表,AttribAgentLV(实时)。

Attrib(实际上是表Agent_Attribute)包含有关座席所属组的信息-座席由列Attrib.SkillTargetID标识,Attrib.AttributeID标识特定组我们感兴趣(一个代理可以属于多个组)

表2包含与特定代理相关的事件。代理标识符为AgentLV.SkillTargetID。特定代理的代理事件可以从该代理所属的任何组发生,并且该信息包括时间戳。

我要提取的信息是:对于特定组中的特工,该特工的最新事件是什么。

该事件与正在查询的组或该代理是其成员的另一个组相关联都没有关系。我只关心该小组中的特工最近的工作。

因此对于特定的组,对于该查询,该组中每个代理将有1行:

SELECT TOP 100 
    Attrib.SkillTargetID AS AttribSKID,
    Attrib.AttributeID,
    [AttributeValue]
FROM 
    Agent_Attribute Attrib --returns 1 STID by itself
WHERE
    Attrib.AttributeID = 5068
ORDER BY
    AttributeValue DESC

赞!

6221    5068    5
6210    5068    5
6197    5068    5
6192    5068    5
6184    5068    5

但是对于AgentLV表,将有多行。

因此,对于代理6221,查询将返回多个事件

SELECT TOP 5 
    AgentLV.SkillTargetID AS AgntLvSKID,
    AgentLV.DateTime,
    AgentLV.Event
FROM
    [prod_awdb].[dbo].[Agent_Event_Detail] AgentLV
WHERE 
    AgentLV.SkillTargetID = 6221
    AND AgentLV.[DateTime] >  GETDATE() - 1

输出:

6221    2019-06-11 07:55:49.000 1
6221    2019-06-11 07:55:53.000 3
6221    2019-06-11 11:30:00.000 3
6221    2019-06-11 11:45:00.000 3
6221    2019-06-11 11:46:20.000 3

我的目标是构造一个查询,该查询为组中的每个用户返回1行-具有最新的时间戳。因此,对于5068组,代理6221应该仅返回

Attrib.SkillTargetID    AgentLV.SillTargetID    Attrip.AttributeID  AttribValue AgentLV.DateTime    AgetnLV.Event
6221            6221            5068            5       2019-06-11:46       3

为此(以最简单的形式),我尝试了以下查询:

SELECT TOP 100 
    Attrib.SkillTargetID AS AttribSKID,
    AgentLV.SkillTargetID AS AgntLvSKID,
    Attrib.AttributeID,
    [AttributeValue],
    AgentLV.DateTime
FROM 
    Agent_Attribute Attrib --returns 1 STID by itself
INNER JOIN
    [prod_awdb].[dbo].[Agent_Event_Detail] AgentLV 
         ON Attrib.SkillTargetID = (SELECT TOP 1 AgentLV.SkillTargetID 
                                    FROM [prod_awdb].[dbo].[Agent_Event_Detail] AgentLV
                                    WHERE AgentLV.SkillTargetID = Attrib.SkillTargetID
                                    ORDER BY DateTime DESC)
WHERE
    Attrib.AttributeID = 5068
    AND AgentLV.DateTime > GETDATE() - 1
ORDER BY 
    AttributeValue DESC

但是,即使我试图通过返回“ TOP 1”从AgentLV返回1行,但对于每个代理我还是有很多行,就像这样:

AttribSKID  AgntLvSKID  AttributeID AttributeValue  DateTime    
6192        5461        5068            5   2019-06-11 21:01:12.007 11:59:08.050
6184        5461        5068            5   2019-06-11 21:01:12.007 11:59:08.050
6221        5461        5068            5   2019-06-11 21:01:12.007 11:59:08.050
6184        5461        5068            5   2019-06-11 21:01:12.000 11:59:08.000
6221        5461        5068            5   2019-06-11 21:01:12.000 11:59:08.000
6192        5461        5068            5   2019-06-11 21:01:12.000 11:59:08.000
6192        6758        5068            5   2019-06-11 21:01:05.007 18:52:13.077
6184        6758        5068            5   2019-06-11 21:01:05.007 18:52:13.077
6221        6758        5068            5   2019-06-11 21:01:05.007 18:52:13.077
6192        5798        5068            5   2019-06-11 21:01:02.007 11:58:21.550
6184        5798        5068            5   2019-06-11 21:01:02.007 11:58:21.550
6221        5798        5068            5   2019-06-11 21:01:02.007 11:58:21.550
6192        6419        5068            5   2019-06-11 21:01:01.007 10:02:28.563
6184        6419        5068            5   2019-06-11 21:01:01.007 10:02:28.563
6221        6419        5068            5   2019-06-11 21:01:01.007 10:02:28.563

我还尝试将第一行更改为

SELECT Distinct TOP 100 

有人可以告诉我我在做什么错吗?

松鼠,这是我尝试查询的修改版本:

SELECT *
FROM   (

       SELECT rn = row_number() over (partition by Attrib.SkillTargetID

                                          order by AgentLV.DateTime desc),
   Attrib.SkillTargetID --AS AttribSKID
   ,AgentLV.SkillTargetID AS AgntLvSKID
  ,Attrib.AttributeID
  --,Attrib.Description
  ,[AttributeValue]
  ,AgentLV.Duration
  ,AgentLV.DateTime
  --,AgentLV.LoginDateTime
       FROM   Agent_Attribute Attrib

       INNER JOIN [prod_awdb].[dbo].[Agent_Event_Detail] AgentLV
       ON     Attrib.SkillTargetID = AgentLV.SkillTargetID 
   ) AS D
WHERE  D.rn = 1
  AND D.AttributeID>5067 AND D.AttributeID<5071
  AND D.[DateTime] >  GetDate()-1 --specify fraction of day
  order by D.AttributeID

我希望获得返回的数据,如下所示:

AttribSKID  AgntLvSKID  AttributeID AttributeValue  DateTime
6197        6197        5068        5       2019-6-12 8:40
6183        6183        5068        5       2019-6-12 8:40
6221        6221        5068        5       2019-6-12 8:39
6192        6192        5068        5       2019-6-12 8:39
6184        6184        5068        5       2019-6-12 8:40
6210        6210        5068        5       2019-6-12 8:40

实际上最终看起来是这样-稍后会出现:

AttribSKID  AgntLvSKID  AgentDTStgsID   DTsettings  Attrib      AttributeID AttributeValue  AgentNm     DN      Duration    DateTime    LoginDateTime
6197        6417        5012        US.Dtsettings   US.Attrib.Name  5068        5       US.NameHere 15551112222 185     2019-6-12 8:40  2019-6-12 8:15

即使两个表的测试数据提取量也很小,这里是否可以附加文件?我找不到它。对于第二个表,Id需要显示大约500行才能使它有用。

1 个答案:

答案 0 :(得分:0)

您可以使用或CheckExistLocationStepAsync窗口函数来生成每个row_number()的序列号

SkillTargetID