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 の最高バージョンです。

1 つの 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で機能しますが、相関サブクエリはあまり効率的に処理されない場合があります(RDBMSによって異なります)。ただし、MSSQL2008では正常に機能するはずです。

于 2012-05-16T13:24:50.207 に答える