2

が 1である DB からすべての行を取得したいのですOWNERKEYが、最高DATAVERSIONのものだけDATACONTROLIDです。

以下の例では、= 1 の 2 つの行がありDATACONTROLID、1 と 2 がありDATAVERSIONます。最高を手に入れたい。

マイデータベース:

DATAKEY       OWNERKEY       OWNERTYPE      DATAVERSION   MALLKEY       DATAVALUE    DATAVALUETYPE   DATACONTROLID   DATADATE     DATATIME      DATASIGN
===========   ============   ===========   ===========   ===========   =========    ============    =============   ==========   ===========   =========     
4              1             2             1             1             1             2                1             2015-11-24   09:55:00:00   ADMIN
3              1             2             2             1             2             2                1             2015-11-23   20:55:00:00   ADMIN
2              1             2             1             1             3             2                2             2015-11-23   15:39:00:00   ADMIN
1              1             2             1             1             4             2                3             2015-11-23   11:29:00:00   ADMIN

希望する結果:

DATAKEY       OWNERKEY       OWNERTYPE      DATAVERSION   MALLKEY       DATAVALUE    DATAVALUETYPE   DATACONTROLID   DATADATE     DATATIME      DATASIGN
===========   ============   ===========   ===========   ===========   =========    ============    =============   ==========   ===========   =========     
3              1             2             2             1             2             2                1             2015-11-23   20:55:00:00   ADMIN
2              1             2             1             1             3             2                2             2015-11-23   15:39:00:00   ADMIN
1              1             2             1             1             4             2                3             2015-11-23   11:29:00:00   ADMIN

どこから始めればよいですか?

SELECT *
FROM MyDB
WHERE OWNERKEY = 1

上記のステートメントは明らかな部分ですが、そこからどのように進めますか?

どうにか使えばいいと思うのですMAX(DATAVERSION)が、何をグループ化すればいいのでしょうか?と の両方を使用でき*ますMAXか?

4

3 に答える 3

2

GROUP BYinを使用した簡単な例を次に示しMSSQLます。

SELECT  DATACONTROLID, 
        MAX(DATAVERSION) AS DATAVERSION, -- Note that 'AS' just gives the column a name in the result set, this isn't required.
        OWNERKEY
FROM    MyDB
WHERE   OWNERKEY = 1
GROUP BY DATACONTROLID, OWNERKEY

DATACONTROLIDこれは、 が「別個の」レコードを決定しDATAVERSION、レコードのインスタンスであると想定しています。

これにより、DATACONTROLID列がMAX(DATAVERSION)グループ化され、グループ化された結果の が返されます。この場合、DATACONTROLID = 1DATAVERSION = 1 and 2あるので、これは 2 を返します。

結果に追加の列を表示する必要があり、それらが のような集計ではないMAX()場合は、ここで列GROUP BYで行ったように、それらを句に追加する必要があることに注意してください。に含めずにOWNERKEY実行しようとすると、エラーが発生します。SELECT OWNERKEYGROUP BY

編集:

を使用して同じ結果を達成するためのより良い方法を次に示しますJOIN

SELECT  *
FROM    MyDB mdb
INNER JOIN (
    SELECT  MAX(DATAVERSION) AS DATAVERSION,
            DATACONTROLID
    FROM    MyDB
    WHERE   OWNERKEY = 1
    GROUP BY DATACONTROLID
) AS mdb2 
    ON  mdb2.DATACONTROLID = mdb.DATACONTROLID 
        AND mdb2.DATAVERSION = mdb.DATAVERSION

これが行うことは、前に示したのと同じGROUP BYステートメントをフィルタリング テーブルに変換することです。このINNER JOIN部分は、MAX(DATAVERSION)DATACONTROLIDそれが属する を選択し、その結果を temp table として返しますmdb2

この新しい内部テーブルは次を返します。

DATAVERSION DATACONTROLID
2           1
1           2
1           3

(SELECT *)次に、その結​​果を取得して、この条件に一致するすべての行を取得します。この内部テーブルには の結果が含まれていないためDATAVERSION = 1 where DATACONTROLID = 1、この行は除外されます。

逆に、最新ではなく古いバージョンのみを表示したい場合は、この基準を に変更してLEFT OUTER JOINを追加できWHERE mdb2.DATAVERSION IS NULLます。

SELECT  *
FROM    MyDB mdb
LEFT OUTER JOIN (
    SELECT  MAX(DATAVERSION) AS DATAVERSION,
            DATACONTROLID
    FROM    MyDB
    WHERE   OWNERKEY = 1
    GROUP BY DATACONTROLID
) AS mdb2 
    ON  mdb2.DATACONTROLID = mdb.DATACONTROLID 
        AND mdb2.DATAVERSION = mdb.DATAVERSION
WHERE mdb2.DATAVERSION IS NULL

MAX(DATAVERSION)inを選択しているmdb2ため、この基準を満たさない行には null が含まれます。

于 2015-11-24T17:54:40.170 に答える
2

これを試して:

SELECT *
  FROM (SELECT OWNERKEY,DATACONTROLID,DATAVERSION,
               rank() over (partition by DATACONTROLID order by DATAVERSION desc) rnk
          FROM MyDB WHERE OWNERKEY = 1)
 WHERE rnk = 1;

注:私はテストしていませんが、これはうまくいくはずです

于 2015-11-24T17:19:26.883 に答える
0

どうですか

SELECT *
FROM MyDB
WHERE OWNERKEY = 1
and   DATAVERSION = 
      (SELECT max(DATAVERSION)
      FROM MyDB
      WHERE OWNERKEY = 1)

これは一部のデータベース環境で機能します。あなたのことを願っています!私は、Rick F. van der Lans による「SQL 入門、リレーショナル データベース言語の習得」からそれを学びました。かなり読みやすい。

于 2015-11-24T17:25:32.160 に答える