3

出于这个问题的目的,我有 2 张桌子。

  1. 请求:时间戳、SessionID、Site、CampaignID、TagName
  2. 事件:时间戳、SessionID、CampaignID、TagName、InteractionID

大多数字段都是 varchar 并允许空值,因为这些是从自定义服务器日志导入的平面文件,有时意外字符可能会从另一个字段泄漏到一个字段中 - 我无法控制。我的要求是提供一份网站报告,详细说明唯一网站、广告标签和每个广告(标签)在每个网站上运行的次数,以及用户与广告的互动次数,以及点击次数,这是定义的作为 3 个交互 ID(1、2 或 3)之一。

运行一个单独的查询来检查 Requests 中的实际数据:

SELECT Convert(CHAR(10), r.Timestamp,101) AS [Date]
    , r.Site, r.CampaignID
    , r.TagName, Count(r.TagName) AS TagCount

FROM Requests AS r
WHERE r.CampaignID = 1901 
GROUP BY CONVERT(CHAR(10), r.Timestamp,101) , r.Site, r.CampaignID, r.TagName
ORDER BY [Date], r.Site, r.CampaignID, r.TagName

产量:

Date        Site    CampaignID   TagName TagCount
09/01/2013  Site1   1901          Tag1    61
09/01/2013  Site1   1901          Tag2    3703
09/01/2013  Site1   1901          Tag3    279
09/01/2013  Site2   1901          Tag1    30
...

为了计算我尝试过的交互次数......

SELECT CONVERT(CHAR(10), r.Timestamp,101) AS [Date], r.Site, r.CampaignID, r.TagName, Count(r.TagName) As TagCount, Count(e.InteractionID) AS InteractionCount
FROM Requests AS r
LEFT JOIN Events as e ON r.SessionID = e.SessionID
WHERE r.CampaignID = 9101 
GROUP BY CONVERT(CHAR(10), r.Timestamp,101) ,r.Site, r.CampaignID, r.TagName
ORDER BY [Date], r.Site, r.CampaignID, e.TagName

产量:

Date        Site    CampaignID  TagName TagCount    InteractionCount
09/01/2013  Site1   9101        Tag1    130         78
09/01/2013  Site1   9101        Tag2    3805        352
09/01/2013  Site1   9101        Tag3    307         53
09/01/2013  Site2   9101        Tag1    30          0
...

我的问题/问题。TagCount 上升了,这让我很吃惊。我可以理解由于加入条件它会如何下降,但为什么会上升?在我看来,第一个查询应该计算所有可用记录,第二个查询不应该找到更多要计算的记录。这一定是我不了解左连接的东西。那么如何从 Requests 中获取 TagCount,以便它只计算所有这些,然后从每个站点和 TagName 的事件中获取 InteractionCount。我对 SQL 不够熟悉,无法提出一个可以实现正确结果的子查询,但我想这就是答案所在。

我的问题的最后一部分是点击

Where e.InteractionID = '1' OR e.InteractionID = '2' OR e.InteractionID = '3'

将我的结果集限制为仅包含点击的那些记录,但我需要左侧的其余记录,如果没有点击,则为 0,以及满足这些条件的任何记录的总和。

我希望我已经清楚了这些问题,感谢您的时间和精力,在此先感谢。

4

2 回答 2

2

如果您的时间戳在组中是唯一的,则:

select
    convert(char(10), r.Timestamp, 101) as [Date],
    r.Site, r.CampaignID, r.TagName,
    count(distinct r.SID) as TagCount,
    count(e.InteractionID) as InteractionCount,
    count(case when e.InteractionID in (1, 2, 3) then e.InteractionID end) as ClicksCount
from Requests as r
    left outer join Events e on e.SessionID = r.SessionID
where r.CampaignID = 9101 
group by
    convert(char(10), r.Timestamp, 101), r.Site, r.CampaignID, r.TagName
order by [Date], Site, CampaignID, TagName;
于 2013-09-08T14:09:40.160 回答
1

标签计数上升的原因是因为您正在计算行数,而不是不同的值。您可以使用count(distinct). 问题是什么是正确的论点。显然,tagName这不是正确的论点,因为您是按该字段分组的。请求 ID 可以工作,但它不可用。这可能有效:

SELECT CONVERT(CHAR(10), r.Timestamp,101) AS [Date], r.Site, r.CampaignID, r.TagName,
       Count(distinct r.sID) As TagCount, Count(e.InteractionID) AS InteractionCount
FROM Requests r LEFT JOIN
     Events e
     ON r.SessionID = e.SessionID
WHERE r.CampaignID = 9101 
GROUP BY CONVERT(CHAR(10), r.Timestamp,101) ,r.Site, r.CampaignID, r.TagName
ORDER BY [Date], r.Site, r.CampaignID, e.TagName;

换句话说,当您进行连接时,您会从left join. 这些被计为倍数。

如果以上都不起作用,则需要将计算作为子查询进行,然后进行联接:

select r.[Date], r.Site, r.CampaignID, r.TagName, r.TagCount,
       count(e.InteractionID) as InteractionCount
from (SELECT Convert(CHAR(10), r.Timestamp,101) AS [Date], r.Site, r.CampaignID
             r.TagName, Count(r.TagName) AS TagCount
      FROM Requests r
      WHERE r.CampaignID = 1901 
      GROUP BY CONVERT(CHAR(10), r.Timestamp, 101), r.Site, r.CampaignID, r.TagName
     ) r join
     events e
     ON r.SessionID = e.SessionID
ORDER BY [Date], r.Site, r.CampaignID, r.TagName;
于 2013-09-08T13:11:46.063 回答