2011-09-07 81 views
0

我有一个包含视图,显示供应点抄表它具有以下列的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(); 
+0

我不能真正阅读第一个代码块。你可以显示表格结构,确定关键值,一些样品数据和所需的结果吗? –

+0

我添加了一些更多的信息。 –

+0

你可以用LINQ调用一个存储过程而不是所有那个mumbo-jumbo吗?我确信有一种方法可以让LINQ在我的答案中形成查询,但是我怀疑如果使用该代码创建存储过程并调用它,那么它的工作量会少很多。或者一个视图可能更容易从LINQ中引用? –

回答

1

这行我绝对不知道如何在LINQ到实体写这同一日期,但以下是直T-SQL中的一般方法(假定rh_sp_number是您想要分组的列)。

SELECT rh.rh_sp_number, rh.rh_end_date /*, ... other cols ... */ 
FROM dbo.Readings_History AS rh 
INNER JOIN 
(
    SELECT rh_sp_number, rh_end_date = MAX(rh_end_date) 
    FROM dbo.Readings_History 
    GROUP BY rh_sp_number 
) AS sub 
ON rh.rh_sp_number = sub.rh_sp_number 
AND rh.rh_end_date = sub.rh_end_date; 

注意,你不指定如何处理关系做(两行具有相同rh_sp_number和rh_end_date值),或是否可行。

+0

谢谢!我最终这样做了(尽管在Linq-to-Entities中) –

相关问题