Delphi Can
Sorgu ile kendinden onceki ve sonraki kayda erişme - Baskı Önizleme

+- Delphi Can (http://www.delphican.com)
+-- Forum: Veri Tabanı (http://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: MS SQL Server (http://www.delphican.com/forumdisplay.php?fid=103)
+--- Konu Başlığı: Sorgu ile kendinden onceki ve sonraki kayda erişme (/showthread.php?tid=3716)



Sorgu ile kendinden onceki ve sonraki kayda erişme - adelphiforumz - 11-06-2019

Selamlar
Bu aralar işten başımı kaldıramıyorum. Fakat @Fesih ARSLAN hocanın yazdıklarını görünce utandım bari Son uğraşlarımdan biri olan SQL üzerinde sorgulama yaparken bir önceki ve bir sonraki kayıt üzerinden veri çekme ile yaptığım işin basit bir halini Döviz Kurları için örnek olsun diye paylaşayım istedim.
[attachment=630]


Cvp: Sorgu ile kendinden onceki ve sonraki kayda erişme - Fesih ARSLAN - 11-06-2019

(11-06-2019, Saat: 12:24)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Selamlar
Bu aralar işten başımı kaldıramıyorum. Fakat @Fesih ARSLAN hocanın yazdıklarını görünce utandım bari Son uğraşlarımdan biri olan SQL üzerinde sorgulama yaparken bir önceki ve bir sonraki kayıt üzerinden veri çekme ile yaptığım işin basit bir halini Döviz Kurları için örnek olsun diye paylaşayım istedim.

Lafım size değildi, profilinizde DelphiCan'a katkılarınız görünüyor. 
Paylaşım ve katkılarınızdan dolayı teşekkür ederim.


Sorgu ile kendinden onceki ve sonraki kayda erişme - edo - 11-06-2019

Katkı olması açısından burada kullanılan metod'lar "Analytic Functions" adı altında geçmekte. Gördüğüm kadarıyla MS SQL'deki analytic functions sayısı Oracle'a göre daha az. Oracle tarafında Lead, Lag, Rank, Dense Rank vs. gibi metodların dışında bütün grup fonksiyonları da (min, max, count, avg, vs.) yine analytic function olarak kullanılabilmekte, muhtemelen MS SQL'de de aynı durum söz konusudur, teyit edebilir misiniz? Bu sayede sorguda bir group by ifadesi olmadığı halde, farklı gruplama mantıkları ile gruplanmış değerler elde edebilirsiniz.


Cvp: Sorgu ile kendinden onceki ve sonraki kayda erişme - adelphiforumz - 11-06-2019

(11-06-2019, Saat: 13:17)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Katkı olması açısından burada kullanılan metod'lar "Analytic Functions" adı altında geçmekte. Gördüğüm kadarıyla MS SQL'deki analytic functions sayısı Oracle'a göre daha az. Oracle tarafında Lead, Lag, Rank, Dense Rank vs. gibi metodların dışında bütün grup fonksiyonları da (min, max, count, avg, vs.) yine analytic function olarak kullanılabilmekte, muhtemelen MS SQL'de de aynı durum söz konusudur, teyit edebilir misiniz? Bu sayede sorguda bir group by ifadesi olmadığı halde, farklı gruplama mantıkları ile gruplanmış değerler elde edebilirsiniz.

@edo bahsettiğinizi anladığım kadarı ile cevap vermeye çalışayım belki yazdığınızı yabnlış anlamış olabilirim.
"Select Max(ForexBuying) From DOVIZKURLARI" gibi bir komut sadece size tek bir satır döndürür. ve tüm veri tabanındaki en büyük değeri getirir
Fakat
"Select Tarih, Max(ForexBuying) From DOVIZKURLARI Group By Tarih" ise içerideki her tarih için en büyük değeri getirir.


Eğer yanlış anlamış ve yanış örneklemiş isem belirtin ki doğru bilgiyi burada tekrardan paylaşalım


Sorgu ile kendinden onceki ve sonraki kayda erişme - SimaWB - 11-06-2019

Emeğinize sağlık @adelphiforumz


Cvp: Sorgu ile kendinden onceki ve sonraki kayda erişme - edo - 12-06-2019

(11-06-2019, Saat: 14:10)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(11-06-2019, Saat: 13:17)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Katkı olması açısından burada kullanılan metod'lar "Analytic Functions" adı altında geçmekte. Gördüğüm kadarıyla MS SQL'deki analytic functions sayısı Oracle'a göre daha az. Oracle tarafında Lead, Lag, Rank, Dense Rank vs. gibi metodların dışında bütün grup fonksiyonları da (min, max, count, avg, vs.) yine analytic function olarak kullanılabilmekte, muhtemelen MS SQL'de de aynı durum söz konusudur, teyit edebilir misiniz? Bu sayede sorguda bir group by ifadesi olmadığı halde, farklı gruplama mantıkları ile gruplanmış değerler elde edebilirsiniz.

@edo bahsettiğinizi anladığım kadarı ile cevap vermeye çalışayım belki yazdığınızı yabnlış anlamış olabilirim.
"Select Max(ForexBuying) From DOVIZKURLARI" gibi bir komut sadece size tek bir satır döndürür. ve tüm veri tabanındaki en büyük değeri getirir
Fakat
"Select Tarih, Max(ForexBuying) From DOVIZKURLARI Group By Tarih" ise içerideki her tarih için en büyük değeri getirir.


Eğer yanlış anlamış ve yanış örneklemiş isem belirtin ki doğru bilgiyi burada tekrardan paylaşalım

Tam olarak anladığınız gibi değil (tam olarak izah edememiş olabilirim). Örneğin ilk iki kolon sırasıyla hafta bazında ve order code bazında count verirken, hiç bir gruplama da yoktur sorguda. 

select 
  count(*) over(partition by invoice_week) count_by_week,
  count(*) over(partition by order_code) count_by_order,
  i.* 
from invoice i 
where 
  invoice_year = 2019 and invoice_Week >= 20

İlk yazdığınız alttaki örnekte group by ifadesi olmaksızın başka bir kolona sorguda yer vermezsiniz çünkü aslında gizli bir grup by işlemi vardır.

Select Max(ForexBuying) From DOVIZKURLARI

İkinci verdiğiniz örnek ise zaten bildiğimiz group function kullanımı, analytic function ile ilgisi yok ikisininde. 

Select Tarih, Max(ForexBuying) From DOVIZKURLARI Group By Tarih

Umarım izah edebilmişimdir.

Tabii bu kullanımlar Oracle için. MS SQL'de de aynı kullanım mümkün mü teyit ederseniz sevinirim.


Cvp: Sorgu ile kendinden onceki ve sonraki kayda erişme - adelphiforumz - 12-06-2019

@edo MS SQL tarafındada sizin yapmış olduğunuz örnekteki şekilde bildiğim ve örneklediğim kadarı ile aynen kullanılabiliyor
SQL tarafında Count, Max, Sum gibi fonksiyonlar Aggregate fonksiyon olarak açıklanıyor fakat 
bu fonksiyonun yanına Over Clause özellikliklerini destekleyerek Oracle da yaptığınız işlemlerin aynısını yapmanız mümkün diye biliyorum.
detaylı kullanımlarını ve bazı örnekleri aşağıdaki linkten inceleyebilirsiniz.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Aşağıdaki örnekte ForexBuying değerine ait aynı olanların içerisindeki kayırlardan yola çıkarak; Count, Min ve Max değerlerini veriyor
   
    Select 
          Count(ForexBuying) Over (Partition By ForexBuying) Tarih_Count,
         Min(Tarih) Over (Partition By ForexBuying) Tarih_Min,
         Max(Tarih) Over (Partition By ForexBuying) Tarih_Max,
         d.*
     From DOVIZKURLARI D
     Where ForexBuying > 0