我有一个包含视图,显示供应点抄表它具有以下列的SQL Server 2000数据库:是否有可能在SQL Server 2000中执行返回整行的GROUP BY?
- rh_sp_number <- the number of the supply point
- rh_... <- a bunch of other columns pertaining to that specific reading row
- rh_end_date <- a `DateTime`field that holds the date of the reading
每个SupplyPoint可以有0..N读数。我需要为任何给定的SupplyPoint提取上次提交的行。我想用一个查询到数据库来完成此操作。
我需要做这样的事情:
var q = db.READINGS_HISTORY.Where(rh => ids.Contains(rh.rh_sp_number))
.GroupBy(rh => rh.rh_sp_number, rh => rh,
(key, values) => values.OrderByDescending(rh => rh.rh_end_date).FirstOrDefault())
.ToList();
在人类语言中,我需要选择各组的最后一行,并返回该行。运行此查询(或者说我能想到的任何其他组合)会导致这样的:
此查询的执行需要APPLY运算符,这是 在SQL Server版本不支持早于SQL Server的 2005年
我需要在SQL Server来完成这个2000
这并不一定是一个“分组依据”表达;任何将返回给定密钥的最大行将做。
我的解决办法:
基于阿伦斯答案,我结束了与此查询,做我需要什么(一个警告,但业务规则删除它形成方程对我来说)。
的警告:如果对于同一SupplyPoints的SQL Server将决定选择
var hists = db.READINGS_HISTORY.Where(rh => ids.Contains(rh.rh_sp_number))
.GroupBy(rh => rh.rh_sp_number, rh => rh,
(key, values) => new { key, date = values.Max(rh => rh.rh_end_date) })
.Join(db.READINGS_HISTORY, g => new { sp = g.key, date = g.date },
rh2 => new { sp = rh2.rh_sp_number, date = rh2.rh_end_date }, (g, rh) => rh)
.Select(rh => new LastReading
{
//omitted..
}).ToList();
我不能真正阅读第一个代码块。你可以显示表格结构,确定关键值,一些样品数据和所需的结果吗? –
我添加了一些更多的信息。 –
你可以用LINQ调用一个存储过程而不是所有那个mumbo-jumbo吗?我确信有一种方法可以让LINQ在我的答案中形成查询,但是我怀疑如果使用该代码创建存储过程并调用它,那么它的工作量会少很多。或者一个视图可能更容易从LINQ中引用? –