2012-03-07 9 views
-1

私はいくつかの更新を行ったので、これを再度転記してください。SQLサーバー2005の値をグループ化し、変更のみを表示

値のセットをグループ化しようとしていますが、変更があった場合にのみ値を表示したいとします。

値が変動し、1から4、3から1、1から1、および1の範囲で変動しているとします。

いくつかの例のデータ

value | date_loaded | 
    1 | 2012-03-07 | 
    1 | 2012-03-06 | 
    1 | 2012-03-05 | 
    3 | 2012-03-04 | 
    4 | 2012-03-03 | 
    1 | 2012-03-02 | 

は、私は彼らが変動した順にそれぞれの値を表示したいのですが、一緒にグループ化。だから、あなたは1、4、3、1の順序でしか見えません。

私は最新の値を表示したいと思います。

value | date_loaded | 
    1 | 2012-03-05 | 
    3 | 2012-03-04 | 
    4 | 2012-03-03 | 
    1 | 2012-03-02 | 

これについてはどのような方法が最適ですか? if文を実行することは可能でしょうか?値1が値2と異なる場合は、+1を「変更」しますか?したがって、私は値を "change1"、 "change2"などでグループ化できますか?

+0

'1' が二回、結果セットにある価値べきか? – diaho

+2

[SQL Server 2005 - 値のグループ化、変更のみの表示]の可能な複製(http://stackoverflow.com/questions/9600766/sql-server-2005-grouping-values-display-only-changes) –

+0

@Michael -sameポスターと彼は彼が再募集していると言っている – Standage

答えて

1

はいかが:

;WITH data AS 
(
SELECT 1 as [value],'2012-03-07' as date 
UNION ALL SELECT 1,'2012-03-06' 
UNION ALL SELECT 1,'2012-03-05' 
UNION ALL SELECT 3,'2012-03-04' 
UNION ALL SELECT 4,'2012-03-03' 
UNION ALL SELECT 1,'2012-03-02' 
) 
,data2 AS 
(
SELECT 
[Value] 
,date 
,row_number() OVER (ORDER BY (SELECT NULL)) as row1 
FROM data 
) 
,data3 AS 
(
SELECT * 
, row1 - row_number() OVER (ORDER BY [Value]) as row2 
from data2 
) 
SELECT 
MIN([Value]) AS [Value] 
,MIN(Date) as Date 
FROM data3 
GROUP BY [Value] - row2 
ORDER BY MIN(row1) 
+0

救助への一時テーブル!ニース@ダビン。 +1 – ImGreg

1
SELECT VALUE,MIN(date_loaded) 
FROM YOURTABLE 
GROUP BY VALUE; 
+0

それだけですべてをそれぞれの値にグループ化していないので、すべての変更があるわけではありませんか? 私が得るのは 1 | 2012-03-05 | 3 | 2012-03-04 | 4 | 2012-03-03 | – Rexxo

1

この解決策はちょっと複雑ですが、ちょっとしたことがあります。残念ながら、私は頭の上からすべてのコードを持っているわけではありませんが、初心者のコンセプトアプローチです:

まず、row_counterを含むtempテーブルselectを作成します。そうようなもの:そして

(SELECT value, date_loaded, row_number() over (partition by date_loaded) as rowNum FROM yourTable) as tempTable1 

反復は、上記一時テーブルは、(tempTable1)を有すること行(tempTableCount)の数に基づいて、whileループのいくつかの並べ替えを使用します。このループは、この一時テーブルを一度に1行ずつ繰り返し、その行を新しい一時テーブルにINSERTします。各挿入の後、以前に挿入された値を追跡し、行カウンタをインクリメントします。値が変更された場合は、挿入を実行し、そうでない場合はループ内で続行します。

私の構文は、概念的には非常に遠く(申し訳ありませんが、ないその上にSQLを使用したコンピュータで)おそらくですが、:

WHILE loopRowCount <= tempTableCount 
BEGIN 

IF(@previousValue <> (SELECT value from tempTable WHERE rowNum = loopRowCount)) 
BEGIN 
    INSERT INTO tempTable2 
    (value, date_loaded) 
     (SELECT value, date_loaded FROM tempTable WHERE rowNum = loopRowCount) 
END 

set @previousValue = (SELECT value FROM tempTable WHERE rowNum = loopRowCount) 
loopRowCount = loopRowCount + 1 
END 

あなたtempTable2あなたは構文エラーの集中砲火を生き残ると仮定すると、目的の結果が含まれます。私は朝にそれを掃除しようとしますが、今夜は最高です!楽しい! xDさん

+0

ああ、あなたが言っていることが分かります!あなたの助けてくれてありがとう、私はそれを行ってあげるよ。 – Rexxo

関連する問題