T-SQL – TOP N İle WITH TIES Kullanalım

Öğrenci bilgilerinin tutulduğu bir veritabanından matematik dersinde en başarılı öğrencinin kaydının istenildiğini varsayalım. Bu bilgiyi nasıl verildiniz? Hemen herkesin aklına gelen ilk sorgu kayıtları not bilgisine göre en yüksek olandan düşük olana göre sıralar ve ilk kaydı verirdim olurdu. Yanlış bir yaklaşım değil ancak şöyle düşünün, en yüksek not 100 ve siz en yüksek not alan tek bir öğrenci bilgisini veriyorsunuz. Peki ya 100 alan birden fazla öğrenci mevcutsa? O zaman vermiş olduğunuz bilgi eksik olacaktır. Şimdi bu senoryoyu baz alarak bu bilgiyi nasıl verebileceğimize bakalım.

Aşağıdaki script ile bir tane tablo oluşturup içerisine sorgulamak için örnek kayıtları işliyorum.

[sql]CREATE TABLE TBL_NOTLAR
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    AD varchar(40),
    DERS varchar(30),
    PUAN int
)
GO
INSERT INTO dbo.TBL_NOTLAR VALUES( ‘MESUT GÜNEŞ’,’MATEMATİK’,98)
INSERT INTO dbo.TBL_NOTLAR VALUES( ‘MUSTAFA DEMİRCİOĞLU’,’MATEMATİK’,98)
INSERT INTO dbo.TBL_NOTLAR VALUES( ‘SİNAN YILMAZEL’,’MATEMATİK’,86)
INSERT INTO dbo.TBL_NOTLAR VALUES( ‘BARIŞ ARSLAN’,’MATEMATİK’,60)
INSERT INTO dbo.TBL_NOTLAR VALUES( ‘ŞENOL GÜNEŞ’,’MATEMATİK’,77)
[/sql]

 

Eklemiş olduğumuz kayıtları listeleyelim.

[sql]SELECT * FROM dbo.TBL_NOTLAR WHERE DERS=’MATEMATİK’
ORDER BY PUAN DESC
[/sql]

table_rows
Söylemiş olduğumuz senaryoya göre “WITH TIES” diye bir sözcüğün varlığını bilmediğimizi varsayarak olası doğru sonuca ulaştıracak sorgumuzu oluşturalım.

[sql]

DECLARE @TOP int
SELECT TOP 1 @TOP=COUNT(ID) FROM TBL_NOTLAR WHERE DERS=’MATEMATİK’  GROUP BY PUAN ORDER BY PUAN DESC

SELECT TOP(@TOP) * FROM TBL_NOTLAR WHERE DERS=’MATEMATİK’ ORDER BY PUAN DESC

[/sql]

Oluşturmuş olduğumuz sorguda Top değerini koşula göre dinamik olarak işletmemiz gerektiği için int türünde “@TOP” isminde değişkenimizi tanımlıyoruz. Koşulumuza uyan kaç adet kayıt olduğu bilgisini “@TOP” değişkenimize atıyoruz. Artık koşula uyan kaç tane kayıt getirmemiz gerektiği bilgisini “@TOP” değişkeninden dinamik olarak alıyoruz ve kayıtlarımızı listeliyoruz.

top_dynamic

Görüldüğü gibi istemiş olduğumuz sonuca ulaştık. Şimdi bu işlemi WITH TIES kullanarak uygulayalım.

[sql]

SELECT TOP 1 WITH TIES * FROm dbo.TBL_NOTLAR  WHERE DERS=’MATEMATİK’ ORDER BY PUAN DESC

[/sql]

“TOP 1” dememize rağmen aynı şartı sağlayan 2 kayıt olduğu için 2 kaydı da kolayca getirmiş olduk.

with_ties

Kısaca;

WITH TIES, ORDER BY ile sıralanan sonuçlarda son kayıt ile aynı değerde olan kayıtların da listelenmesini sağlar.
WITH TIES sadece ORDER BY ile birlikte kullanılmaktadır.

avast premier satın al

Mesut Güneş

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şuan Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

You may also like...

1 Response

  1. Durmuş Yılmaz dedi ki:

    Ellerine sağlık Mesut

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.