SQL在特定范围内返回列中具有最大值的行

时间:2013-07-30 14:54:06

标签: c# .net sql database oledb

我正在使用OleDbDataAdapter在C#中填充DataTable,我试图让查询无法取得成功。

与服务器之间的通信工作正常,正如简单查询所证明的那样,它返回所有记录而没有任何过滤器:

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, Revision " +
                                "FROM dbo.PDSIsometricSheets WHERE SchemaName='{0}'", projectNo);

这给了我一个大约8000个条目的列表,但是有一些冗余。

有多个行具有相同的LineID,但每个行都有一个单独的Revision值。我试图只获取每个LineID的修订版本最高的行,范围为0到5。

以下是我到目前为止尝试过的一些尝试:

var commandText = string.Format("SELECT * FROM 
                               (SELECT max(Revision) as LatestRev
                                FROM dbo.PDSIsometricSheets) 
                                WHERE Revision < 5" , projectNo);


var commandText = string.Format("SELECT T.IsoShtRevID, T.LineID, T.Filename, T.Revision
                                 FROM dbo.PDSIsometricSheets T
                                 WHERE Revision = 
                                       (SELECT MAX(T1.Revision)
                                        FROM dbo.PDSIsometricSheets T1
                                        WHERE T1.IsoShtRevID = T.IsoShtRevID
                                       )", projectNo);

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, MAX(Revision) as LatestRevision 
                                 FROM dbo.PDSIsometricSheets WHERE SchemaName='{0}'
                                 GROUP BY LineID, IsoShtRevID, Filename", projectNo);

以下是我到目前为止尝试使用此功能的问题:

SQL Select only rows with Max Value on a Column

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

Fetch the row which has the Max value for a column

Select Rows with Maximum Column Value group by Another Column

上面的所有内容都返回与原始查询相同的内容,或者只是从错误的语法中输出错误。 SQL是我最强大的事情,我试图通过使用DataAdapter来确定我的功能是否有限。

更新:

这是最新的迭代,使用下面的一些建议:

var commandText = string.Format("SELECT IsoShtRevID, LineID, Filename, MAX(Revision) as MaxRevision " +
                                "FROM dbo.PDSIsometricSheets " +
                                "WHERE SchemaName='{0}' AND Revision <= 5 AND Revision >= 0" +
                                "GROUP BY IsoShtRevID, LineID, Filename", projectNo);

这会将修订过滤掉0到5之间的值,但LineID仍有多行,每行都有不同的版本号。这就像Max命令被忽略了......

2 个答案:

答案 0 :(得分:3)

选项3应该可以工作,但如果不是,则因为FileName或IsoShtRevID在修订版中发生了变化。在这种情况下,您可以这样做:

SELECT  a.IsoShtRevID ,
        a.LineID ,
        a.Filename ,
        a.Revision 
FROM    dbo.PDSIsometricSheets a
join (select max(Revision) as Revision, LineID 
      from  dbo.PDSIsometricSheets where SchemaName ='{0}' ) x 
     join a on a.Revision = x.Revision and a.LineID=x.LineID
WHERE   a.SchemaName = '{0}'

答案 1 :(得分:1)

最后得到了感谢评论,阅读更多SQL,并在运行时努力查看我的命令字符串以进行拼写错误。

var commandText = string.Format("SELECT T1.IsoShtRevID, T1.LineID, T1.FileName, T1.Revision " +
                                "FROM dbo.PDSIsometricSheets T1 " +
                                "INNER JOIN (" +
                                    "SELECT LineID, MAX(Revision) as MaxRevision " +
                                    "FROM dbo.PDSIsometricSheets " +
                                    "WHERE SchemaName='{0}' AND Revision <= 5 AND Revision >= 0" +
                                    "GROUP BY LineID" +
                                ") T2 " +
                                "ON T1.LineID = T2.LineID AND T1.Revision = T2.MaxRevision ", projectNo);