如何对数据进行分组以报告时间范围

时间:2013-12-01 01:17:45

标签: c# sql sqlite

长期读者,第一次在这里发布海报。我目前正在使用c#和sqlite编写DPS图形程序。我想创建解析数据的直方图,以图形形式显示DPS。 sql基本上只是将数据存储在数据库中。

我遇到的问题是我无法为DPS设置垃圾箱。我想将每个箱子增加5秒钟。目前我通过获取事件的特定时间然后将其转换为秒来计算使用SQLite中的时间戳进行raid的秒数。我已经将raid的开始和raid的结束转换为秒,但是我希望每5秒为数据库中的每个日志添加一个bin。我真的不知道如何做到这一点,我所拥有的就是raid发生的秒数。

我的代码看起来像这样

string selectName = "SELECT sourceName, sum(amount) FROM dataTable GROUP BY      
                         sourceName ORDER BY sourceName, amount";

QLiteCommand selectCommand = new SQLiteCommand(selectName, conn);
SQLiteDataReader dataReader = selectCommand.ExecuteReader();

//selects the time for the first encounter in a raid

string firstEncounter = "SELECT sum(strftime('%s', timeStamp) -
                         strftime('%s', '00:00:00' )) FROM dataTable WHERE ID = 0";

SQLiteCommand selectCommand1 = new SQLiteCommand(firstEncounter, conn);
SQLiteDataReader dataReader1 = selectCommand1.ExecuteReader();

string finalEncounter = "SELECT sum(strftime('%s', timeStamp) - 
                         strftime('%s', '00:00:00' )) FROM dataTable WHERE ID = " + ID;

SQLiteCommand selectCommand2 = new SQLiteCommand(finalEncounter, conn);
SQLiteDataReader dataReader2 = selectCommand2.ExecuteReader();

ArrayList names = new ArrayList();

Console.WriteLine(finalEncounter);

while (dataReader1.Read() && dataReader2.Read()) 
{
    firstEncounterSeconds  = dataReader1.GetInt32(0);
    finalEncounterSeconds = dataReader2.GetInt32(0);

    Console.WriteLine("total firstEncounterSeconds = " + firstEncounterSeconds);
    Console.WriteLine("final encounter seconds = " + finalEncounterSeconds);

    int totalFightTime = finalEncounterSeconds - firstEncounterSeconds;

raid所占用的当前秒数是3774,我想将每个条目分组在5秒的范围内,每5秒计算一次dps。我希望这不是太苛刻,虽然我真的无法理解它。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您似乎只是想在特定时间范围内对数据点进行分组,因此您可以对它们进行一些分析。在您的示例中,如果您分别在第1,3和4秒有三个事件,则您希望将它们视为在Bin-1中。

如果是这种情况,那么您需要做的就是将时间数据四舍五入到您想要的bin的大小。您可以通过使用舍入值更新原始时间戳然后对其进行分组,或者最好将新列添加到数据源,将其设置为事件所属的Bin,然后按Bin ID进行分组。

我可能会这样做:

  1. 为SecondsSinceStart添加一列
  2. 将SecondsSinceStart设置为raid start和event time之间的差异
  3. 添加EventBinID
  4. 将EventBinID设置为SecondsSinceStart / 5(或您想要分组的任何内容)
  5. 只要步骤#4默认为int,或者您可以执行此操作,现在您可以为每个可以分组和报告的事件设置Bin ID。可以通过对Bin ID进行分组并将聚合的总和除以该Bin中的事件数来计算Bin DPS。