SQL Veri çekme sorusu

SQL:
SELECT *
FROM demo
WHERE demo.tarih = (SELECT MAX(tarih) FROM demo)
AND
(Select sınıf From demo Where demo.tarih = max(tarih)) <> (Select sınıf FROM demo Where demo.tarih = min(tarih))

Sub-query'nin parantezlerini unutmuşum tekrar deneyebilirsiniz.

Aynen hocam parantezleri tamamlayıp çalıştırınca " misuse of aggregate function MAX() " şeklinde bir hata aldım.
 
SQL:
SELECT *
FROM demo
WHERE (Select sınıf From demo Where demo.tarih = (Select max(tarih) FROM demo)) <> (Select sınıf FROM demo Where demo.tarih = (Select min(tarih) FROM demo))

Çok teşekkürler hocam çalıştı. Yalnız şöyle bir durum var, bu kod ilk ve son tarihteki sınıf değerleri aynı olduğunda herhangi bir veri çekmiyor, fakat farklı olduğunda sadece son kaydı değil de tüm kayıtları listeliyor.

Yanına AND ile birlikte "demo.tarih = (SELECT MAX(tarih) FROM demo)" şeklinde bir tamamlama yaptım ama bu şekilde de sadece ilk tarihteki sınıfından farklı olan max. tarih değerindeki sınıf değerini çekiyor.
 
Son düzenleme:
select distinct *

diye başlatın sadece farklı değerler gelsin.

GROUP BY demo.tarih DESC

diye bitirmeyi deneyin.

Hocam kodu revize edip çalıştırdım işe yaradı teşekkür ederim. Sadece şeyi çözemedim, tablo içinde veri çekerken X kişisinin eğer sınıfı değiştiyse sınıfı çekebiliyorum.

Fakat aynı tablo içerisinde Y kişisi için veri çekmek istediğimde tarih kolonunda aynı tarihler olduğunda hata alıyorum, çakışma oluyor. Yani:

Tarih ------ Sınıf -----İsim
01/02/2021------A ------X
10/02/2021------B-------X
15/02/2021------C ------X

şeklinde bir tablo varken sınıf değişikliği olmuş olduğu için C olarak veri çekebiliyorum, A -> B -> A olsaydı sınıf değiştirmediği için veri çekmiyor buraya kadar problem yok.

Fakat tabloda
01/02/2021------A-------Y
05/02/2021------B-------Y

şeklinde başka bir kişinin verileri de olduğunda başlangıç tarihleri aynı olduğu için hata veriyor ve Y kişisinin sınıf değiştirmiş olduğu satırı çekemiyorum. Aldığım hata "more than one row returned by a subquery used as an expression" oluyor bu arada. Ben iki kişi için de çekmek istiyorum.

Tarih ------ Sınıf -----İsim
01/02/2021------A ------X
10/02/2021------B-------X
15/02/2021------C ------X
02/02/2021------A-------Y
20/02/2021------B-------Y

Mesela tablo böyleyken de ilk tarih X kişisinin A sınıfında olduğu tarih, max tarih de Y kişisinin B'de olduğu tarih olduğu için sorgu sonunda 20/02/2021------B-------Y çıktısını alıyorum fakat hem bunu Y kişisi için almak istiyorum, hem de 15/02/2021------C ------X çıktısını X kişisinin değişikliği için almak istiyorum.

Bunun için case yapısı mı kullanmam gerek? Kod yapısı aşağıdaki şekilde PostgreSQL için. CURRENT_DATE yapısını sadece içinde bulunulan aydaki sınıf değişikliklerini tespit etmek için kullandım, onlarda bir sıkıntı yok çalışıyor.

Kod:
SELECT sınıf, isim, tarih FROM demo
WHERE demo.tarih = (SELECT MAX(tarih) FROM demo WHERE tarih >= date_trunc('month', CURRENT_DATE) AND tarih >= date_trunc('year', CURRENT_DATE))
AND (Select sınıf From demo Where demo.tarih = (Select max(tarih) FROM demo))
<> (Select sınıf FROM demo Where demo.tarih = (Select min(tarih) FROM demo WHERE tarih >= date_trunc('month', CURRENT_DATE) AND tarih >= date_trunc('year', CURRENT_DATE)))
 
Son düzenleme:
"more than one row returned by a subquery used as an expression" LIMIT 1 yazarak evade edilebilir.

İkinci soru içinse en başında değişmeyenler görünmesin istemiştiniz ama şimdi görünsün mü istiyorsunuz ? Tam olarak anlayamadım.

En sondaki soru içinse yeni bir query yazılmalı ancak detay bilmeden çok yardımcı olabileceğimi düşünmüyorum. Veri tabanlarınlarıyla taş çatlasa 3 ay uğraşmışımdır ve bu kadar kompleks değildi yazdığım query'ler. Daha profesyonel birinden yardım alsanız daha iyi olacak.
 
"more than one row returned by a subquery used as an expression" LIMIT 1 yazarak evade edilebilir.

İkinci soru içinse en başında değişmeyenler görünmesin istemiştiniz ama şimdi görünsün mü istiyorsunuz ? Tam olarak anlayamadım.

En sondaki soru içinse yeni bir query yazılmalı ancak detay bilmeden çok yardımcı olabileceğimi düşünmüyorum. Veri tabanlarınlarıyla taş çatlasa 3 ay uğraşmışımdır ve bu kadar kompleks değildi yazdığım query'ler. Daha profesyonel birinden yardım alsanız daha iyi olacak.

Tamamdır hocam teşekkür ederim. LIMIT koyarak o hatayı çözdüm.

Genel olarak tek sıkıntım farklı kişi olduğunda onun kaydını da çekememek kaldı.

01/02/2021------A ------X
10/02/2021------B-------X
15/02/2021------C ------X
02/02/2021------A-------Y
10/02/2021------B-------Y

Böyle bir tabloda çıktı aldığım zaman sadece 15/02/2021------C ------X satırını alabiliyorum. Min ve max. tarihlerine X ve Y kişisi için ayrı ayrı bakamıyorum sanırım bu sorgu ile.

Ben hem A kişisinde sınıf değişikliği olduğu için 15/02/2021------C ------X çıktısını, hem de B kişisinde sınıf değişikliği olduğu için 10/02/2021------B-------Y çıktısını almak istiyorum fakat bu sorguda önce ilk tarihe ve sınıf değerine bakılıyor, bir de son tarihe ve sınıf değerine bakılıyor ve kıyaslama yapıp sonuç olarak o çekiliyor.

Yani tabloda ilk ve son tarih olarak

01/02/2021------A ------X
20/02/2021------C-------Y

Bu datalar varken bunlar baz alınıp sınıfları kıyaslanıp 20/02/2021------C-------Y satırı olarak çıkıyor. X kişisinin kendi içinde, Y kişisinin kendi içindeki tarih-sınıf kıyaslamaları yapılıp ayrı ayrı çıktı vermesi için farklı bir yapı gerekli sanırım dediğiniz gibi.
 
2. kişiyi almak için en sona yazdığınız kısımda kişi == X dediğiniz yerin hemen yanına OR Kişi == Y dediğinizde Y kişisininde ilgili kaydı dönmeli.

Ama aklınızda olsun MAX(tarih) kullanıldığında en büyük tarihe göre ilgili değer döneceğinden X kişisinde bu değer 15 iken Y kişisinde 10 olduğundan hata çıkmaması için ilgili değer subquery'lere de girilmeli.

Son olarak ekleme de yapıyım şahsen ben bunu sql içine ya da driver yoluyla başka bir dil kullanarak yani fonksiyon yordamıyla çözerdim. Query için fazla kompleks olmuş. Daha optimize çözümler için cursor kullanılması gerekli.
 
2. kişiyi almak için en sona yazdığınız kısımda kişi == X dediğiniz yerin hemen yanına OR Kişi == Y dediğinizde Y kişisininde ilgili kaydı dönmeli.

kişi == X kısmı hangisi hocam? Yani kolon içinde birden çok kişi olduğu zaman da her kişi için tarih-sınıf değişikliği kaydına bakıp ona göre çıktı almak istiyorum. Ben de pek SQL bilmiyorum, aradığım şey IF döngüsünde kişiye bakarak sınıf değişikliği olup olmadığını kontrol edip veri çekmek. Yani değişiklik varsa çıktı almak, yoksa diğer kişiye geçip onu kontrol etmek şeklinde devam. Bu tabloda bir de Z kişisisinde değişiklik olsa onun için de kontrol yapıp çıktı almam gerek.

IF yapısına alternatif CASE yapısı mı var bu SQL'de dedim ama ondan da emin değilim bu sorguda kullanmak için.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı