Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一小时内的多个条目只能计数一次_C#_Sql Server - Fatal编程技术网

C# 一小时内的多个条目只能计数一次

C# 一小时内的多个条目只能计数一次,c#,sql-server,C#,Sql Server,输出: 所需输出 如何操作此结果以按此条件进行筛选: -如果同一IP在一小时内有多个条目,则只应计算一次 我是否应该尝试将读取器[]转换为C#格式,然后尝试进行比较? 或者我应该只使用SQL queryes吗?您可以使用 //Query data public void GetDataByCountry(string gameID) { string query = "SELECT clickDate, userIp FROM gameLinks

输出:

所需输出

如何操作此结果以按此条件进行筛选:
-如果同一IP在一小时内有多个条目,则只应计算一次

我是否应该尝试将
读取器[]
转换为C#格式,然后尝试进行比较?
或者我应该只使用SQL queryes吗?

您可以使用

//Query data
public void GetDataByCountry(string gameID)
{
    string query = "SELECT clickDate, userIp FROM gameLinks 
                     where userCountry = @userCountry";

    using (con = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(query, con);
        command.Parameters.AddWithValue("@userCountry", gameID);
        con.Open();

        SqlDataReader reader = command.ExecuteReader();

        dgvHourIp.Rows.Clear();
        while (reader.Read())
        {
            string[] row = new[]
            {
                reader[0].ToString(), //hour
                reader[1].ToString()  //ip
            };
            dgvHourIp.Rows.Add(row);
        }
        reader.Close();
        reader.Dispose();
    }
}
现在,在dttemp变量中有一个不同的数据

或 您可以使用LINQ

DataTable dttemp = yourtableName.DefaultView.ToTable(true, "Hour", "IPAddress");

根据@Cris的建议,记录应按ip、日期排序

var distrows= yourtableName.AsEnumerable().Distinct();
使用两个变量只存储最后一行

string query = "SELECT clickDate, userIp FROM gameLinks where userCountry = @userCountry order by userIp, clickDate";

我想我已经理解了你的要求,但是你能通过你希望得到什么样的结果来澄清吗?所以,最简单的方法是在SQL查询中,或者当您将数据作为可枚举对象返回时使用LINQ我的2美分:您应该首先执行以下操作:执行SQL查询以检索您期望的结果,因为我认为您不需要操纵您的程序来获取您期望的第一个结果(按IP地址对结果进行分组的查询)。当然,这只是我的意见。这是一个你想修改什么的问题,而不是什么是最好的。什么是期望的日期(小时)?我在问题中添加了期望的输出。看起来需要某种结构(可能是字典)来根据每个IP地址进行修改。也许可以删除旧条目以避免内存不足。嘿,这似乎有效!这只是为了演示,所以我现在不太担心内存。但是其他阅读此内容的人应该知道。@Cris您可能需要将查询更改为使用
order by userIP,请单击Date
,否则将无法捕获两个或多个交替的IP地址。我删除了
lastDate=Convert.ToDateTime(行[0])在if语句中,只是为了在一小时内获取所有记录
SqlDataReader reader = command.ExecuteReader();

srtring lastIp = "";
DateTime lastDate;

dgvHourIp.Rows.Clear();
while (reader.Read())
{
    string[] row = new[]
    {
        reader[0].ToString(), //hour
        reader[1].ToString()  //ip
     };

     if (lastIp != "")
     {
         TimeSpan ts = Convert.ToDateTime(row[0]).Substract(lastDate));
         if (lastIp == row[1] && ts.TotalMinutes < 60)
         {
             lastIp = row[1];
             continue;
         }
     }
     lastIp = row[1];
     lastDate = Convert.ToDateTime(row[0]);

     dgvHourIp.Rows.Add(row);
}
record 1 --> 40 min --> record 2 --> 50 min --> record 3