2

私はこのクエリを持っています:

SELECT ID, Value 
FROM Table 
WHERE ID = (SELECT MIN(ID) FROM Table WHERE RecID = 12637)

UNION

SELECT ID, Value 
FROM Table 
WHERE ID = (SELECT MAX(ID) FROM Table WHERE RecID = 12637)

これにより、2 つの値の結果の違いを理解してもらいたいと考えています。しかし、IDが異なる場合にのみそうする必要もあります.1つのレコードしか返されない場合、1つの結果しか返されないと私は信じているので、これは問題ではないと思います。

アップデート

ID  |  Value
------------
100 | 23000
110 | 25000

現在のクエリ結果は上に表示されています。2000年の結果を得る方法を探しています。

その背後にあるストーリー 各エントリの値を取得するテーブルがあります。後続のリビジョンである 1 つのレコードまたは 15 のレコードが存在する可能性があります。MIN(ID)最初の記録と最新の記録で最初に報告されたものの違いを知りたいMAX(ID)

4

3 に答える 3

1

おそらくこれを行うにはもっと優雅な方法がありますが、私にはアプローチがあると思います。最初と最後の行を見つけて、結果を結合して 1 つの行を作成し、計算を行います。行が1つしかない場合、あなたが何を望んでいるのか100%確信が持てませんでした。左外部結合にして、最大値ではなく最小値に何かが存在できるようにし、結合基準の一部として、一致する ID を除外します。それが正しくない場合は、AND MN.ID <> MX.IDラインを切り取ります

CREATE TABLE #tmp
(
    ID int IDENTITY(1,1) NOT NULL
,   RecID int NOT NULL
,   Value int NOT NULL
);

INSERT INTO
    #tmp
(
    RecID
,   Value
)
SELECT
    AC.object_id AS RecID
,   AC.precision + AC.scale AS Value
FROM
    sys.all_columns AS AC;


WITH MINS AS
(
    -- Find the first value for all the recids
    SELECT
        T.RecID
    ,   T.Value
    ,   T.ID
    FROM
        #tmp T
    WHERE
        T.ID = 
        (
            SELECT MIN(TI.ID) AS FirstID
            FROM #tmp TI
            WHERE TI.RecID = T.RecID
        )
)
, MAXS AS
(
    -- Find the last value for all the recids
    SELECT
        T.RecID
    ,   T.Value
    ,   T.ID
    FROM
        #tmp T
    WHERE
        T.ID = 
        (
            SELECT MAX(TI.ID) AS FirstID
            FROM #tmp TI
            WHERE TI.RecID = T.RecID
        )
)
SELECT 
    MN.RecID
,   MN.Value - COALESCE(MX.Value, 0) AS Delta
,   MN.ID AS FirstID
    -- might not exist
,   MX.ID AS LastID 
FROM
    MINS AS MN
    -- Assume we don't want things that were never updated
    LEFT OUTER JOIN
        MAXS AS MX
        ON MN.RecID = MX.RecID
        AND MN.ID <> MX.ID
;
于 2013-06-21T17:48:41.447 に答える
-2

あなたの要件は私にははっきりしていませんが、EXCEPT を使用して集合減算を行うことができます

于 2013-06-21T16:34:47.140 に答える