2017-04-10 12 views
1

私は学生情報を保持するテーブルを持っています。上記の表でSQLサーバーのレコードの変更を見つける方法

+==========================================+ 
| ID  | Department  | Date   | 
+==========================================+ 
| 001  | English   | Feb 3 2017 | 
| 001  | English   | Feb 4 2017 | 
| 001  | Science   | Mar 1 2017 | 
| 001  | Maths   | Mar 2 2017 | 
| 001  | Maths   | Mar 21 2017 | 
| 001  | Maths   | Apr 2 2017 | 
| 001  | English   | Apr 7 2017 | 
| 002  | Maths   | Feb 1 2017 | 
| 002  | Maths   | Apr 7 2017 | 
| 003  | Maths   | Apr 3 2017 | 
| 003  | Maths   | Apr 7 2017 | 
| 004  | Science   | Feb 1 2017 | 
| 004  | Science   | Mar 1 2017 | 
| 004  | Maths   | Apr 7 2017 | 
| 004  | English   | Apr 9 2017 | 
+==========================================+ 

私は学生の部門の嗜好が変更されるたびに生徒のレコードのリストを取得する必要があります。また、同じ部門に再度変更することもできます。したがって、上記のサンプルデータのために、レコードのリストは、004

| 004  | Science   | Mar 1 2017 | 
| 004  | Maths   | Apr 7 2017 | 
のための学生001

| 001  | English   | Feb 4 2017 | 
| 001  | Science   | Mar 1 2017 | 
| 001  | Maths   | Apr 2 2017 | 

002および003は何も

については

だろう戻りました

ロジックを適用しようとすると私hereで指定した場合、パーティションオンは機能しません。これは、学生が同じ部門に再度アクセスできるようになるためです。親切に助けてください。

+0

あなたが何を記述し、あなたが結果として提示するものが異なっていて混乱している。 –

+0

@RameshKharbuja私は部門のユーザーの好みが変更されたレコードを探しています。混乱の原因を教えてください。 – Poppy

+1

生徒1と生徒4の結果に英語の行はありませんが、生徒1と生徒4の英語には数学の変更があります。 –

答えて

5

あなたはLEADウィンドウ関数を使用することができます - SQLのバージョン2012以降...

DECLARE @SampleData AS TABLE 
(
    Id int, 
    Department varchar(20), 
    [Date] date 
) 

INSERT INTO @SampleData 
VALUES (1,'English', 'Feb 3 2017'),(1,'English', 'Feb 4 2017'),(1,'Science', 'Mar 1 2017'), 
(1,'Maths', 'Mar 2 2017'),(1,'Maths', 'Mar 3 2017'),(1,'English', 'Mar 7 2017'), 
(2,'Maths', 'Feb 3 2017'),(2,'Maths', 'Feb 4 2017'), 
(3,'Maths', 'Feb 3 2017'), (3,'Maths', 'Feb 4 2017'), 
(4,'Science', 'Feb 1 2017'), (4,'Science', 'Feb 2 2017'), (4,'Maths', 'Feb 3 2017'),(4,'English', 'Feb 4 2017') 

;WITH temps AS 
(
    SELECT sd.*, LEAD(sd.Department, 1) OVER(PARTITION BY id ORDER BY sd.[Date]) AS NextDepartment 
    FROM @SampleData sd  
) 
SELECT t.id, t.Department,t.[Date] FROM temps t 
WHERE t.Department != t.NextDepartment 

デモリンクのために:Rextester

参考リンク:LEAD - MDSN

古いバージョンのためにあなたがOUTER APPLYを使用することができます

SELECT sd.* 
FROM @SampleData sd 
OUTER APPLY 
(
    SELECT TOP 1 * FROM @SampleData sd2 WHERE sd.Id = sd2.Id AND sd.[Date] < sd2.[Date] 
) nextDepartment 
WHERE sd.Department != nextDepartment.Department 
+0

SQL Server 2012以降のみ。 –

+0

はい、私は気づくでしょう... – TriV

関連する問題