假设我有一个包含三列的数据表:timestamp,curveID和price。我想给出时间,然后选择每天的时间戳,curveID和价格,但前提是所有的curveID都存在。
问题是,并非每次都存在所有数据,因此在10:00:00可能只有curveID 1的数据,但ID = 2没有,依此类推。
我以为我可以执行以下操作来选择第一个数据集,其中所有的curveID都在那里且时间大于或等于我的标准:
dataSet.ReadXml(@"C:\temp\Prices.xml", XmlReadMode.InferTypedSchema);
ds = dataSet.Tables[0];
var dt = ds.Clone();
int criteria = 10;
var list = ds.AsEnumerable().Where(x => x.Field<DateTime>("Timestamp").Hour >= criteria)
.GroupBy(x => new{Date = x.Field<DateTime>("Timestamp").Date, Curve = x.Field<object>("CurveID")})
.First().ToList();
但是,对于相同的曲线ID,它会在同一天(在不同时间)返回多个记录。 我想在接近所有curveID存在的标准时间的每一天为每个curveID返回一条记录。
为清楚起见,我想说我正在寻找curveID 1&amp; 2,如果在第1天的10:00:00只有曲线ID 1存在但曲线ID 2缺失我将需要检查是否在10:01:00两者都在那里,如果是,我当天采取两个记录集来自那时。我必须在数据库中检查每天
答案 0 :(得分:1)
您可能希望先按日期分组,然后按小时使用
等分组group thing by new {
firstThing = x.Field<DateTime>("TimeStamp").Date,
secondThing = x.Field<DateTime>("TimeStamp").Date.Hour,
}
我的语法可能有些偏差,但这应该让你朝着正确的方向前进
答案 1 :(得分:1)
// criteria is your integer Hour representation
var criteria = 10;
// array of curveIds to look for
var curveIds = new int[] {1, 2};
var result =
// grouping by date first
ds.GroupBy(x => x.Field<DateTime>("Timestamp").Date,
(date, items) => new { date, items = items
// items with the same timestamp go to one group
.GroupBy(i => i.Field<DateTime>("Timestamp"), (datetime, timestampItems) => new { datetime, timestampItems })
// filter by criteria
.Where(dti => dti.datetime.Hour >= criteria)
// filter by curveIds
.Where(dti => curveIds.All(cid => dti.timestampItems.Any(tsi => tsi.Field<int>("curveID") == cid)))
.OrderBy(dti => dti.datetime)
.FirstOrDefault() });
最后,您将收到符合您提到的所有要求的“每日”结果:在某些条件之后发生,所有curveIds
都是最早的。