【发布时间】:2014-10-09 01:58:43
【问题描述】:
我不确定标题是否合适,但我想做的是创建一个聚合表,其中包含按 小时 细分的统计信息,但我需要一段时间内的不同值到那个小时。示例:
ID Group Date
-------------------------
1 1 1/1/2014 11:00
2 1 1/1/2014 11:00
1 1 1/1/2014 11:00
3 1 1/1/2014 11:00
3 2 1/1/2014 12:00
1 2 1/1/2014 12:00
1 1 1/1/2014 12:00
2 1 1/1/2014 12:00
4 1 1/1/2014 12:00
结果是:
Count Group Hour
------------------------
3 1 11:00
2 2 12:00
1 1 12:00
请注意 ID 1 如何在第 1 组中多次出现,但在多个小时内仅计数一次,但按小时分组。我的问题是我在那个小时内变得独一无二,但如果另一个 1 发生在另一个小时内,它就会被计算在内。
这是我的查询:
MERGE dbo.tblStatsHourlyDomainCampaign AS Target
USING (SELECT
(LEFT(CONVERT(VARCHAR,sl.CreateDate,120),13) + ':00') as ReportDay,
em.DomainID, COUNT(distinct sl.EmailID) as Opens, sl.QueueID
FROM dbo.tblEmail em
INNER JOIN dbo.tblImpressionLog sl ON em.EmailID = sl.EmailID
WHERE sl.CreateDate >= '10/1/2014' AND sl.CreateDate < '10/10/2014'
GROUP BY LEFT(CONVERT(VARCHAR,sl.CreateDate,120),13) + ':00', em.DomainID , sl.QueueID) AS Source
ON (target.domainid = source.domainid AND target.ReportDay = source.ReportDay
AND target.QueueID = source.QueueID)
WHEN NOT MATCHED BY TARGET AND source.DomainID IS NOT NULL
THEN
INSERT (DomainID, ReportDay, Opens, QueueID)
VALUES (source.DomainID, source.ReportDay, source.Opens, source.QueueID)
WHEN MATCHED
THEN
UPDATE
SET target.Opens = source.Opens;
【问题讨论】:
-
请将示例数据列名称更新为查询中使用的确切名称。如果我猜对了,你只需要从 groupby 中删除一列
标签: sql-server tsql datetime sum distinct