SQL ile çoklu alandan 1'ine göre Gruplama nasıl yapılır.

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

SQL ile çoklu alandan 1'ine göre Gruplama nasıl yapılır.

Mesaj gönderen mrmarman »

Merhabalar...

- Sorunum SQL ile Gruplama ile ilgili... DISTINCT ve GROUP BY'ı bir türlü uygun şekilde kullanamadım... Konuyu açayım... :idea:

- Forumdaki soruları inceledim, hemen hepsi Count ile saydırarak veya hesaplama sonucu gruplamaları içeriyor.. Geriye kalanlar da yazım kural hataları zaten.. :lol:

- İhtiyacım olan şey, SQL kurallarına aykırı olan aşağıdaki kod ile ifade etmek istediğim şeyi gerçekleştirmek. :oops:

Kod: Tümünü seç

SELECT Alan1, Alan2, Alan3, AlanN FROM VeriTablo
ORDER BY Alan1 DESC
GROUP BY Alan2
NOT:- Önce order et sonra grupla şeklinde bilerek yanlış yazıldı...

- Yani birden fazla alana göre sorgu kurup, bu alanlardan sadece birisi olan Alan2'ye göre Gruplamak... Diğer alanlar da sıralama için değişik zamanlarda lazım... :idea:

- Her alandaki değerler farklı olduğu için DISTINCT içine aldığımızda veya GROUP BY'a hepsini dahil ettiğimizde doğal olarak tüm kayıtlar geliyor... :?

// EDIT // Düzeltme

* Amaç; ALAN2 gruplu kayıtların en son girilmiş olanını bulup tekil olarak listelemek...

Teşekkürler...
En son mrmarman tarafından 15 Oca 2005 02:14 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Ekelemek istediğim bir husus vardı.. Edit yapmak istemedim yukardaki sorum halen geçerlidir...

- Aşağıdaki gibi bir kurgu ile GRUPLAMA adına benzer sonucu aldım ama 1560 kayıtlık veritabanında 20 saniye sürüyor. İç Select'deki ORDER BY'ı kaldırırsam 5 saniyeye düşüyor...

Kod: Tümünü seç

     SELECT T1.Alan1, T1.Alan2, T1.Alan3, T1.AlanN
     FROM VeriTablo  T1
     WHERE T1.Alan1 = ( SELECT TOP 1 T2.Alan1
                            FROM VeriTablo T2
                            WHERE T1.Alan2 = T2.Alan2
                            ORDER BY T1.Alan1 DESC     )
     ORDER BY T1.Alan1 DESC
- Yorumu olan lütfen çekinmeyin... :o
Resim
Resim ....Resim
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Valla üstadım ustanın sorusuna da insan nasıl cevap vereceğini şaşırıyor doğrusu .
:D

İkinci sorunuz hakkında bir yorumda bulunmak istiyorum.
Sorgulama süresinin uzamasının nedeni Order By da belirttiğiniz alanın indekslenmemiş olmasından kaynaklanabilir.

Kolay gelsin...
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

ID	TARIH	    GRUP
1	01.01.2004	1
2	01.01.2004	2
3	02.02.2004	3
4	04.04.2004	1
5	01.01.2004	5
6	01.02.2004	2
7	01.05.2004	3
yukarıdaki değerlere sahip bir tablo oluşturup aşağıdaki sql kodunu yazınca sonuç olarak

Kod: Tümünü seç

SELECT * FROM DENEME D
WHERE D.tarih = (SELECT MAX(T.tarih) FROM DENEME T
                          WHERE T.grup = D.grup)
ORDER BY D.grup

Kod: Tümünü seç

ID	TARIH	   GRUP
4	04.04.2004	1
6	01.02.2004	2
7	01.05.2004	3
5	01.01.2004	5
yukarıdakileri dönderdi.

1 nolu grubu ait en son girilmiş kayıt.
2 nolu gruba ait en son girilmiş kayıt
.....

sorgu zamanı ne kadar sürer fikrim yok :(

sorunuzu yanlış anlamadıysam tabi :)

sizin yazdığınız sorguyla birbirlerine çok benziyorlar fakat performans için bi deneme yapılabilir gib....
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@sadettinpolat

// EDIT// Edildi...
- Cevap için teşekkürler... Çözümüne baktımda, MAX ile TOP aynı kategoride, alan isimlerini manuel yazmıştım sendeki de * ile alınmış... Hız konusunda da haklısın benzer oldular...

- Tarih alanı gibi güzel bir alan yok... :( Veritabanını ben hazırlasam index bile döşerdim ama mevcut bir Access veritabanına çözüm üretmeye çalışıyorum...

@oguzozturk74 :) Index konusunda haklı olabilirsin... Firma veritabanı olduğundan öyle hazırlanmamış. Aslında haklısın ben yaparım Create temp_table like original_table gibi bir satırla yenisini oluşturur burada işlemleri yapar sonra DROP ederim. haklısın... Bir denerim..

- Ama genel olarak ilk sorunum devam ediyor EXCEL bunu nasıl yapıyor bir de onu inceliycem hani filtreleme olayı... :shock:
En son mrmarman tarafından 15 Oca 2005 04:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

ID, TARIH ve GRUP alanların sahip tabloya test amaçlı 10.000 kayıt girip yazdığım sorguyu çalıştırınca bir hayli yavaş olduğunu gördüm. bu tür bir işlem için gerekli alanların indexlenmiş olması gerekiyor

index ekleyince sorgu sonuçları 1,5 saniyenin altına düştü fakat sorgu sonuçlarında birşey gözüme takıldı.

Kod: Tümünü seç

ID       TARIH          GRUP
...
...
1254  07.02.2004     1
5611  07.02.2004     1
...
...

//edit: yukarıdaki mesajınızı görmeden burayı yazmış bulundum. neyse silmeyelim bu da dursun burda :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla