質問

歴史を持つテーブルにSQLサーバーが基本的にはトラック項目を示します.目の一定の分野な変更プロセス全体を通じてグループは、複数の分野の状況を含む、Idを値としての過程に増加しました。

基本的には取り込んで最後のステップのための各項目されるバッチを参考にした。その場合について

Select * from HistoryTable where BatchRef = @BatchRef

じていますが、これらのすべてのステップの全ての項目のバッチ-eg

Id状況BatchRef ItemCount
1       1       Batch001        100
1       2       Batch001        110
2       1       Batch001        60
2       2       Batch001        100

っていきたいと思っております:

Id状況BatchRef ItemCount
1       2       Batch001        110
2       2       Batch001        100

編集:Appologies-できないようにテーブルタグ作業の値下げ-次の文のみならず、様にプレビュー

役に立ちましたか?

解決

このような硬いえるテーブルのデザイン-もう食べたお区切り文字.

の基本的な取扱いにつきましてはグループによる固定の分野を選んでa MAX(または)一unqiue値(datetimeいようにしてください).このケースでは、 考え グループのようBatchRefとItemCount、Idはお客様独自のカラムです。

その後、参加のテーブルをすべて取得した。のようなもの:

SELECT * 
FROM HistoryTable
JOIN (
   SELECT 
       MAX(Id) as Id.
       BatchRef,
       ItemCount
   FROM HsitoryTable
   WHERE
       BacthRef = @batchRef
   GROUP BY
       BatchRef,
       ItemCount
 ) as Latest ON
   HistoryTable.Id = Latest.Id

他のヒント

といってアイデンティティの列のテーブ---

select 
    top 1 <fields> 
from 
    HistoryTable 
where 
    BatchRef = @BatchRef 
order by 
    <IdentityColumn> DESC

を想定した項目Idを段階的に番号:

--Declare a temp table to hold the last step for each item id
DECLARE @LastStepForEach TABLE (
Id int,
Status int,
BatchRef char(10),
ItemCount int)

--Loop counter
DECLARE @count INT;
SET @count = 0;

--Loop through all of the items
WHILE (@count < (SELECT MAX(Id) FROM HistoryTable WHERE BatchRef = @BatchRef))
BEGIN
    SET @count = @count + 1;

    INSERT INTO @LastStepForEach (Id, Status, BatchRef, ItemCount)
        SELECT Id, Status, BatchRef, ItemCount
        FROM HistoryTable 
        WHERE BatchRef = @BatchRef
        AND Id = @count
        AND Status = 
        (
            SELECT MAX(Status) 
            FROM HistoryTable 
            WHERE BatchRef = @BatchRef 
            AND Id = @count
        )

END

SELECT * 
FROM @LastStepForEach
SELECT id, status, BatchRef, MAX(itemcount) AS maxItemcount 
FROM HistoryTable GROUP BY id, status, BatchRef 
HAVING status > 1 

奥高尾にひっそりと建つ料亭。くdecypherデータの大量破壊兵器は形式で引っぱることができるようなトリックに必要な共通のテーブルの表情にSQL2005年

with LastBatches as (
    select Batch, max(Id)
    from HistoryTable
    group by Batch
)
select *
from HistoryTable h
    join LastBatches b on b.Batch = h.Batch and b.Id = h.Id

またはサブクエリとグループのサブクエリ作品の上に私の頭の思):

select *
from HistoryTable h
    join (
        select Batch, max(Id)
        from HistoryTable
        group by Batch
    ) b on b.Batch = h.Batch and b.Id = h.Id

編集:たと仮定していた最後の項目 理いたしません。場合だけでは、一つのバッチその他の回答を行うトップ1および順降順でのかかるものと思われます。

とを示唆し、それを受けていう双方向の内部状態を表示します検索するには並べ替えで、その他の方向で実際にフェッチの順に書きます。そういうものを使っておけば間違いないように

SELECT TOP 1 ...

使用している場合は、指定2k以前、またはSQLに準拠しvariant

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber = n

その他のバージョン(またはその他のデータベースをサポートするシステムの標準表記)

SELECT ... LIMIT 1 OFFSET 0

一部なしに変更されることもなく、標準SQLです。

参照 この 質問の一部追加的な議論の周辺選定されています。の集計関数max()でありばより速くかどうかに応じて計算を要するテーブルスキャン!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top