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