【发布时间】:2018-10-03 18:13:43
【问题描述】:
我有两张桌子。
第一个是open count:
openDate OpenCount
2014-08-01 07:00:06.163 1
2014-08-01 09:00:11.873 1
2014-08-02 03:00:42.623 1
2014-08-02 05:00:48.363 1
2014-08-02 08:01:15.243 1
2014-08-03 07:01:16.507 1
第二个是点击次数
clickDate Count
2014-08-01 08:00:06.163 1
2014-08-01 09:00:11.873 1
2014-08-01 11:00:42.623 1
2014-08-01 15:00:48.363 1
2014-08-03 07:01:15.243 1
2014-08-11 07:01:16.507 1
我想要 2 小时明智、4 小时明智、每周明智和所有时间明智
我使用了以下代码
int groupHours = 2;
int take = 12;
if (type == 1 )
{ groupHours = 2; }
else if (type == 2 )
{ groupHours = 4; }
else if (type == 7 )
{
groupHours = 24;
take = 7;
}
else if( type == 0)
{
take = 12;
}
var queryOpen = objEmailOpen.AsEnumerable()
.GroupBy(row => new
{
Date = row.openDate.Value.Date,
Hour = (((row.openDate.Value.Hour) / groupHours)) * groupHours
})
.Select(grp => new
{
Date = grp.Key.Date.AddHours(grp.Key.Hour),
Hour = grp.Key.Hour,
OpenCount = grp.Count()
}).OrderBy(m => m.Date).Take(take).ToList();
var queryClick = objEmailClick.AsEnumerable()
.GroupBy(row => new
{
Date = row.clickedDate.Value.Date,
Hour = (((row.clickedDate.Value.Hour) / groupHours)) * groupHours
})
.Select(grp => new
{
Date = grp.Key.Date.AddHours(grp.Key.Hour),
Hour = grp.Key.Hour,
ClickCount = grp.Count()
}).OrderBy(m => m.Date).ToList();
var timeWise = (from m in queryOpen
join n in queryClick on new { m.Date, m.Hour } equals new { n.Date, n.Hour }
select new
{
date = Convert.ToDateTime(m.Date),
open = m.OpenCount,
click = n.ClickCount
}).ToList().Take(12);
var result = new
{
timeWise = timeWise
};
但这不会给出正确的结果,如果任何时间间隔点击计数为空(0),那么它不会显示该时间间隔记录,这也不适用于所有时间记录。
我希望所有时间记录只在第 12 行,可能需要 1 天的时间间隔或多天或多月。
但结果包含正确的日期时间间隔,例如(如果时间间隔为 2 小时):
date openCount clickcount
2018-8-1 07:00:00 15 3
2018-8-1 09:00:00 3 0
2018-8-1 011:00:00 12 2
【问题讨论】:
-
您需要使用贝尔实验室多年前开发的算法来按时间段统计电话使用情况。要处理空情况,您必须建立一个时间段表,然后将数据放入时间段中。
-
你能给我那个算法的链接吗
-
没有真正的算法。如果你想要几个小时,那么创建一个每小时有 24 行的表。然后使用左外连接将您的表与 24 小时的新表连接起来(以获取空值)。