4

不确定是否有一种优雅的方式来实现这一点:

数据

ID   Ver   recID  (loads more columns of stuff)  
1     1       1  
2     2       1  
3     3       1  
4     1       2  
5     1       3  
6     2       3  

因此,我们将 ID 作为主键,将 Ver 作为版本,将 recID 作为记录 ID(将所有版本绑定在一起的任意基础 ID)。

所以我想select从以下数据,第 3、4 和 6 行。即给定记录 ID 的最高版本。

有没有办法用一个 SQL 查询来做到这一点?或者我需要SELECT DISTINCT在记录 ID 上做一个,然后单独查询以获得最高值?还是将批次拉入应用程序并从那里过滤?

4

4 回答 4

5

AGROUP BY足以获得每个recID.

SELECT  Ver = MAX(Ver), recID
FROM    YourTable
GROUP BY
        recID

如果还需要对应的ID,可以把这个包装成子选择

SELECT  yt.*
FROM    Yourtable yt
        INNER JOIN (
          SELECT  Ver = MAX(Ver), recID
          FROM    YourTable
          GROUP BY
                  recID
        ) ytm ON ytm.Ver = yt.Ver AND ytm.recID = yt.RecID

或者,根据您使用的 SQL Server 版本,使用ROW_NUMBER

SELECT  *
FROM    (
          SELECT  ID, Ver, recID
                  , rn = ROW_NUMBER() OVER (PARTITION BY recID ORDER BY Ver DESC)
          FROM    YourTable
        ) yt
WHERE   yt.rn = 1
于 2012-05-16T13:22:01.847 回答
5

ver获得给定的最大值recID很容易。要获得ID,您需要加入获得这些最大值的嵌套查询:

select ID, ver, recID from table x
inner join
    (select max(ver) as ver, recID
     from table
     group by recID) y
on x.ver = y.ver and x.recID = y.recID
于 2012-05-16T13:22:02.223 回答
2

您可以使用ctewithROW_NUMBER函数:

WITH cte AS(
    SELECT ID, Ver, recID
    ,      ROW_NUMBER()OVER(PARTITION BY recID ORDER BY Ver DESC)as RowNum
    FROM data
)
SELECT ID,Ver,recID FROM cte
WHERE RowNum = 1
于 2012-05-16T13:22:07.247 回答
2

使用子查询的简单示例:

SELECT  a.*
FROM    tab a
WHERE   ver = (
            SELECT max(ver)
            FROM   tab b
            WHERE  b.recId = a.recId
        )

(注意:这假设 (recId, ver) 的组合是唯一的。通常,这些列上会有一个主键或唯一约束,按此顺序,然后该索引可用于优化此查询)

这适用于几乎所有 RDBMS-es,尽管相关的子查询可能无法非常有效地处理(取决于 RDBMS)。不过在 MS SQL 2008 中应该可以正常工作。

于 2012-05-16T13:24:50.207 回答