MS Sql birden çok kayıt arasında son tarihli veya ilk tarihli kaydın bulunması

MS SQL ile aynı kişi veya ID ye ait birden çok satırlı kayıtlarda son kayıt tarihi veya ilk kayıt tarihine ulaşmak bazı durumlarda çok önemlidir.
İlk kayıt için MIN(TARIH) ifadesi, son kayıt için MIN(TARIH) ifadesini kullanmalıyız.
Öncelikle bu konu için aşağıdaki sorgu ile GECICI_TABLO isminde bir tablo oluşturabiliriz.
SELECT 1 AS ID,'AHMET1' AS ADI,'DENEME1' AS SOYADI,'10.02.1982' AS TARIH
INTO #GECICI_TABLO
UNION
SELECT 1 AS ID, 'AHMET1' AS ADI,'DENEME1' AS SOYADI,'21.05.2014' AS TARIH UNION
SELECT 1 AS ID, 'AHMET1' AS ADI,'DENEME1' AS SOYADI,'28.04.2014' AS TARIH UNION
SELECT 4 AS ID,'AHMET4' AS ADI,'DENEME4' AS SOYADI,'12.01.2014' AS TARIH UNION
SELECT 4 AS ID,'AHMET4' AS ADI,'DENEME4' AS SOYADI,'18.06.2014' AS TARIH UNION
SELECT 4 AS ID,'AHMET4' AS ADI,'DENEME4' AS SOYADI,'13.03.2014' AS TARIH UNION
SELECT 2 AS ID,'AHMET2' AS ADI,'DENEME2' AS SOYADI,'05.07.2014' AS TARIH UNION
SELECT 2 AS ID,'AHMET2' AS ADI,'DENEME2' AS SOYADI,'30.07.2014' AS TARIH UNION
SELECT 2 AS ID,'AHMET2' AS ADI,'DENEME2' AS SOYADI,'17.04.2014' AS TARIH UNION
SELECT 2 AS ID,'AHMET2' AS ADI,'DENEME2' AS SOYADI,'10.06.2014' AS TARIH UNION
SELECT 5 AS ID,'AHMET5' AS ADI,'DENEME5' AS SOYADI,'12.08.2014' AS TARIH UNION
SELECT 5 AS ID,'AHMET5' AS ADI,'DENEME5' AS SOYADI,'20.08.2014' AS TARIH UNION
SELECT 3 AS ID,'AHMET3' AS ADI,'DENEME3' AS SOYADI,'08.01.2014' AS TARIH UNION
SELECT 3 AS ID,'AHMET3' AS ADI,'DENEME3' AS SOYADI,'25.08.2014' AS TARIH UNION
SELECT 3 AS ID,'AHMET3' AS ADI,'DENEME3' AS SOYADI,'11.06.2014' AS TARIH
Oluşturduğumuz geçici tablomuzun içeriği aşağıdaki gibidir.
SELECT * FROM #GECICI_TABLO
ID | ADI | SOYADI | TARIH |
1 | AHMET1 | DENEME1 | 21.05.2014 |
1 | AHMET1 | DENEME1 | 28.04.2014 |
2 | AHMET2 | DENEME2 | 05.07.2014 |
2 | AHMET2 | DENEME2 | 10.06.2014 |
2 | AHMET2 | DENEME2 | 17.04.2014 |
2 | AHMET2 | DENEME2 | 30.07.2014 |
3 | AHMET3 | DENEME3 | 08.01.2014 |
3 | AHMET3 | DENEME3 | 11.06.2014 |
3 | AHMET3 | DENEME3 | 25.08.2014 |
4 | AHMET4 | DENEME4 | 12.01.2014 |
4 | AHMET4 | DENEME4 | 13.03.2014 |
4 | AHMET4 | DENEME4 | 18.06.2014 |
5 | AHMET5 | DENEME5 | 12.08.2014 |
5 | AHMET5 | DENEME5 | 20.08.2014 |
Tarih alanına göre aynı Id ye ait en büyük tarihili kayıtın bulunması
SELECT ID,ADI,SOYADI,TARIH
FROM #GECICI_TABLO
WHERE TARIH=(SELECT MAX(TARIH) FROM #GECICI_TABLO AS T1 WHERE T1.ID=#GECICI_TABLO.ID)
ORDER BY ID
Sonuç
ID | ADI | SOYADI | TARIH |
1 | AHMET1 | DENEME1 | 28.04.2014 |
2 | AHMET2 | DENEME2 | 30.07.2014 |
3 | AHMET3 | DENEME3 | 25.08.2014 |
4 | AHMET4 | DENEME4 | 18.06.2014 |
Tarih alanına göre aynı Id ye ait en küçük tarihili kayıtın bulunması
SELECT ID,ADI,SOYADI,TARIH
FROM #GECICI_TABLO
WHERE TARIH=(SELECT MIN(TARIH) FROM #GECICI_TABLO AS T1 WHERE T1.ID=#GECICI_TABLO.ID)
ORDER BY ID