2016-09-13 10 views
-1

データを以下のように設定しているとします。 StyleIdが変更された日付を特定したいと思います。データセットは正しい順序ではないので、私の観察は間違っています。SQL ServerのレコードIDと日付でグループ化されたデータを注文する

たとえば、(2016-04-07のスタイルIDは530から526に変更されますが)現在のオーダーに応じて、スタイルIDは530から526まで07thに変更されます同じ日に526から530に、そして最後に19番目が530から526に変わります。このデータセットを正しい方法で注文してください。

Data set

更新:それはすべてのシナリオには適用されませんので、

SELECT * 
FROM SewingPlan 
ORDER BY SewingDate, StyleId DESC 

DESCを使用して

は有効な解決策ではありません。

アップデート2:

私は私が思いついた答えと解決策を掲載しています。より良いソリューションをお持ちの方?

+0

あなたは、サンプルコード/クエリではなく、データセットのスクリーンショットを提供することはできますか?何を試しましたか? – Russ

+0

あなたは他のどの列を持っていますか?これらのレコードを挿入するもの、トリガーは何ですか?論理は何ですか?非常に多くの質問... – scsimon

+0

応答に感謝します。クエリは複雑なものです。ここに投稿するだけで簡単にするのは難しいです。しかし、これは私が注文する必要のある最終的な結果のデータセットとみなすことができます。 「SELECT * FROM SewingPlan」から始めるにはどうすればいいですか? ORDER BY SewingDate、StyleId ' – Anjana

答えて

0

解決策&仮定: SewingPlanテーブルに主キーがあります。これはSewingPlan_IDです。それは自動的に1つずつ自動的に増加しています。 最小値は最も早い値にする必要があります。

このクエリは変更された主キーを返します。

SELECT MIN(SewingPlan_ID) FROM SewingPlan Group BY StyleId 

あなたはstyleIdの答えとして1000を得たとします。その後、今あなたが主キーを知っていることを何でも照会することができます。あなたは参加することもできますし、ネストされたクエリは何でもできます。

SELECT * FROM SewingPlan where SewingPlan_ID=1000 

あなたの回答を教えてください。

更新: また、あなたが使用することができます簡単にstyleId

SELECT MIN(SewingDate) FROM SewingPlan Group BY StyleId 
+0

良い解決策のためにサンカさんに感謝します。しかし、私は主キーを使ってこれを試しました。問題は、最小値が必ずしも早いとは限りません。ユーザーがレコードバックデートを入力したことがあります。したがって、主キーも順序どおりではありません。だから私はここでプライマリキーの列については言及しなかった。 – Anjana

+0

私は質問をしたときに私があなたを間違えたと思います。私は変更された日付を取得したいとはいえ、それに伴って多くの複雑なことが行われます。シナリオ全体を説明することはできません。レコードを注文することは必須であることをご存じですか。 – Anjana

0

ための変更日付を取得する私は、カーソルを使用してみましたし、(追加の列なし)所望の出力を達成しました。これはおそらくそれを行う汚い方法です。将来の参照のためのクエリの投稿。より最適化された、より良いソリューションが大歓迎です。

DECLARE @id int, @SewingDate datetime, @StyleId int,@PreviousStyleId int 

SELECT TOP 1 @PreviousStyleId = StyleId 
FROM SewingPlan 
ORDER BY SewingDate,StyleId 

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL DROP Table #TempTable 

CREATE TABLE #TempTable(SewingDate DATETIME,StyleId INT,Sequence INT) 

DECLARE sewingdates 
CURSOR FOR 
    SELECT SewingDate 
    FROM SewingPlan 
    GROUP BY SewingDate 
    ORDER BY SewingDate 

OPEN sewingdates 
FETCH NEXT 
FROM sewingdates 
INTO @SewingDate 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    INSERT INTO #TempTable (SewingDate, StyleId, Sequence) 
    SELECT SewingDate,StyleId,ROW_NUMBER() OVER (ORDER BY (CASE WHEN StyleId = @PreviousStyleId THEN '1' ELSE StyleId END)) 
    FROM SewingPlan 
    WHERE SewingDate = @SewingDate  

    SELECT TOP 1 @PreviousStyleId = StyleId 
    FROM SewingPlan 
    WHERE SewingDate = @SewingDate  
    ORDER BY (CASE WHEN StyleId = @PreviousStyleId THEN '1' ELSE StyleId END) DESC 

FETCH NEXT 
FROM sewingdates 
INTO @SewingDate 
END 
CLOSE sewingdates 
DEALLOCATE sewingdates 

SELECT * FROM #TempTable 

GO 

Ordered Data Set

関連する問題