質問
歴史を持つテーブルに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()でありばより速くかどうかに応じて計算を要するテーブルスキャン!