有规律的数据中如何查找偶尔丢失的数据!

net_xiaojian 2012-08-28 11:11:59
--表结构
table(id,tm,myValue)
--数据
value(1,'2012-8-27 20:00:00',1)
value(1,'2012-8-27 21:00:00',1)
value(1,'2012-8-27 22:00:00',1)
value(1,'2012-8-27 23:00:00',1)
value(1,'2012-8-28 00:00:00',1)
value(1,'2012-8-28 01:00:00',1)
value(1,'2012-8-28 02:00:00',1)
value(1,'2012-8-28 03:00:00',1)
value(1,'2012-8-28 04:00:00',1)
value(1,'2012-8-28 05:00:00',1)
value(1,'2012-8-28 06:00:00',1)
...
...

假如划横线的那条数据丢失,如何在List<T>里面知道这条数据已丢失,丢失以后把该条数据补上去,myValue可以为0

或这有好的办法在sql查询的时候就知道丢失了哪些数据(好像这方法不靠谱)。
...全文
135 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cakecc 2012-08-28
  • 打赏
  • 举报
回复
1楼的方法可行啊,自己建一个全量的tm表,再加个flag,然后定时去匹配你的 table 更新flag,然后没有更新过的flag那个时间,就是丢失的数据了
net_xiaojian 2012-08-28
  • 打赏
  • 举报
回复
有没有好方法!?
net_xiaojian 2012-08-28
  • 打赏
  • 举报
回复
这种情况在在sql里面效率可能没有在外部高,丢掉的数据不会很多。ls
robake 2012-08-28
  • 打赏
  • 举报
回复
可以用临时表实现,
思路如下:
先使用rownum生成你的那些标准的数据,写入临时表。
然后,再查询你的表中不存在于临时表里的数据,这样就可以了。

可以写为存储过程来实现。
net_xiaojian 2012-08-28
  • 打赏
  • 举报
回复
做好了才看到论坛6楼的解决方案,本人没有测试,不会写这种sql,下列是我的方法!


/// <summary>
/// 【雨量】时段数据有时会丢,补充丢失的数据返回新List.
/// </summary>
/// <param name="lst"></param>
/// <returns></returns>
protected List<Model.st_rain_r> ReturnModifyList(List<Model.st_rain_r> lst)
{
DateTime dtBegin = lst[0].TM;
DateTime dtEnd = lst[lst.Count - 1].TM;

TimeSpan ts = dtEnd.Subtract(dtBegin);

int recordCount = ts.Days * 24 + ts.Hours + 1;

int i = 0;

for (DateTime dtStart = lst[i].TM; i < recordCount - 1; dtStart = dtStart.AddHours(1))
{
Model.st_rain_r m = lst.Find(delegate(Model.st_rain_r inner) { return inner.TM == dtStart; });

if (m == null)
{
m = new FFWS.Model.st_rain_r();

m.STCD = lst[i].STCD;
m.TM = dtStart;
m.DRP = 0f;

lst.Insert(i, m);
}

i++;
}

return lst;
}

/// <summary>
/// 报文4 雨量测站监测信息
/// </summary>
/// <param name="STCD"></param>
/// <param name="beginDT"></param>
/// <param name="endDT"></param>
/// <returns></returns>
public List<Model.st_rain_r> GetRainfallForXML(string STCD, DateTime beginDT, DateTime endDT)
{
string strSql = "select * from st_rain_r where STCD=@stcd and TM between @beginTime and @endTime order by TM asc";

DbParameter[] cmdParms = {
ShanHongHelper.CreateInDbParameter("@stcd",DbType.AnsiStringFixedLength,STCD),
ShanHongHelper.CreateInDbParameter("@beginTime",DbType.DateTime,beginDT),
ShanHongHelper.CreateInDbParameter("@endTime",DbType.DateTime,endDT)};

using (DbDataReader dr = ShanHongHelper.ExecuteReader(CommandType.Text, strSql.ToString(), cmdParms))
{
List<Model.st_rain_r> lst = GetList(dr);

return ReturnModifyList(lst); //返回更新过的List
}
} }
KevinLiu 2012-08-28
  • 打赏
  • 举报
回复

create table test1 (id int,tm datetime,myValue int)

insert into test1
values(1,'2012-8-27 20:00:00',1),
(1,'2012-8-27 21:00:00',1),
(1,'2012-8-27 22:00:00',1),
(1,'2012-8-27 23:00:00',1),--Missing 2012-08-28 00:00:00.000
(1,'2012-8-28 01:00:00',1),
(1,'2012-8-28 02:00:00',1),
(1,'2012-8-28 03:00:00',1),--Missing 2012-08-28 04:00:00.000
(1,'2012-8-28 05:00:00',1),
(1,'2012-8-28 06:00:00',1)

;with tmp as
(
select row_number()OVER (order by tm asc) as Num,---排除最小的TM
id,
DATEADD(HOUR,-1,tm) as tm,
myValue
from test1 t1 where not exists
(select tm from test1 t2 where DATEADD(HOUR,1,t2.tm) = t1.tm )
)

insert into test1
select id,tm,myValue from tmp where Num > 1


select * from test1 order by tm asc


id tm myValue
----------- ----------------------- -----------
1 2012-08-27 20:00:00.000 1
1 2012-08-27 21:00:00.000 1
1 2012-08-27 22:00:00.000 1
1 2012-08-27 23:00:00.000 1
1 2012-08-28 00:00:00.000 1
1 2012-08-28 01:00:00.000 1
1 2012-08-28 02:00:00.000 1
1 2012-08-28 03:00:00.000 1
1 2012-08-28 04:00:00.000 1
1 2012-08-28 05:00:00.000 1
1 2012-08-28 06:00:00.000 1

(11 row(s) affected)


shshjun 2012-08-28
  • 打赏
  • 举报
回复
List<T>
有规律的,又使用了list,不是通过索引一下就计算出来了吗?遍历一次就好了.
除非你是想用二分法等.

当然数据库操作会更简单一些.

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧