我在连接查询中遇到麻烦,该查询返回重复的记录,希望有人可以帮助我弄清楚发生了什么事情。
我已经在这里查看了类似的帖子,并根据该信息对查询进行了一些改进,但是我并不是一个真正的SQL专家,我似乎无法获得正确的组合。
基本上我有2个表,Attrib
和AgentLV
(实时)。
表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行才能使它有用。
答案 0 :(得分:0)
您可以使用或CheckExistLocationStepAsync
窗口函数来生成每个row_number()
的序列号
SkillTargetID