none
iki kayıt arasındaki fark RRS feed

  • Soru

  • Selam sql de 1 ay içinde 8-10 kayıt var ben bu kayıtların içinde ilk kaydettiğim miktar ile son kaydettiğim miktar arsındaki farkı bulmak istiyorum nasıl bulurum?
    4 Eylül 2019 Çarşamba 07:53

Tüm Yanıtlar

  • Soru cok yetersiz ve ornek veri yok :(

    Yazilan kodun basit bir tek grup icin oldugunu sanmıyorum. Muhtemelen Northwind database'i ornek alırsak, her müşteri icin Orders'taki ilk ve son girdilerini alıp aralarındaki  ID ve OrderDate farklarına bakmak gibi birseyden bahsediyorsunuz sanırım: 

    select 
     ilk.Id as ilkSiparis, son.Id as sonSiparis, 
     ilk.Tarih as ilkTarih, son.Tarih as sonTarih,
     son.Id - ilk.Id as FarkID,
     datediff(day, ilk.Tarih, son.Tarih) as farkTarih,
     * 
    from Customers c
    outer apply (select top(1) OrderDate, OrderId from Orders o where o.CustomerId = c.CustomerId order by OrderDate) ilk(Tarih, Id)
    outer apply (select top(1) OrderDate, OrderId from Orders o where o.CustomerId = c.CustomerId order by OrderDate desc) son(Tarih, Id);
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    4 Eylül 2019 Çarşamba 12:47
  • SELECT TOP 1 
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) SonDeger,  
    FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)  AS IlkDeger,
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS FarkTutar
    FROM Sales.SalesOrderDetail


    Yukarıda ki şekilde son değer - ilk değeri alabilirsiniz. Burada dikkat edilecek nokta ORDER BY sonrasında sıralamanın yapılacağı kolon adıdır. Buradan yola çıkarak bir kaç denemede çözeceğinizi düşünüyorum. Çözemezseniz tablonun kendisinin şemasını yazın direk çalışan kodu yazayım.
    25 Eylül 2019 Çarşamba 20:42
  • SELECT TOP 1 
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) SonDeger,  
    FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)  AS IlkDeger,
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS FarkTutar
    FROM Sales.SalesOrderDetail


    Yukarıda ki şekilde son değer - ilk değeri alabilirsiniz. Burada dikkat edilecek nokta ORDER BY sonrasında sıralamanın yapılacağı kolon adıdır. Buradan yola çıkarak bir kaç denemede çözeceğinizi düşünüyorum. Çözemezseniz tablonun kendisinin şemasını yazın direk çalışan kodu yazayım.

    Neden bu sekilde yapilmasini öneriyorsunuz? Daha mi iyi bir query plan oluşturuyor? Ozellikle 2. LAST_Value( ...) gereksiz ve zaman kaybettirici olmaz mi?

    Not: Bu arada sorunun sahibinden medet ummayın, 20 günden fazladır zahmet edip ilgilenmemiş sorusuyla. Benim yazdıgimi beğenmemiş de olabilir tabii.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    • Düzenleyen CetinBasoz 26 Eylül 2019 Perşembe 15:48
    26 Eylül 2019 Perşembe 15:46
  • SELECT TOP 1 
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) SonDeger,  
    FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)  AS IlkDeger,
    LAST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FIRST_VALUE([LineTotal]) OVER(ORDER BY [LineTotal] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS FarkTutar
    FROM Sales.SalesOrderDetail


    Yukarıda ki şekilde son değer - ilk değeri alabilirsiniz. Burada dikkat edilecek nokta ORDER BY sonrasında sıralamanın yapılacağı kolon adıdır. Buradan yola çıkarak bir kaç denemede çözeceğinizi düşünüyorum. Çözemezseniz tablonun kendisinin şemasını yazın direk çalışan kodu yazayım.

    Neden bu sekilde yapilmasini öneriyorsunuz? Daha mi iyi bir query plan oluşturuyor? Ozellikle 2. LAST_Value( ...) gereksiz ve zaman kaybettirici olmaz mi?

    Not: Bu arada sorunun sahibinden medet ummayın, 20 günden fazladır zahmet edip ilgilenmemiş sorusuyla. Benim yazdıgimi beğenmemiş de olabilir tabii.



    Yorumunuz için teşekkür ederim. Arkadaşın ne istediği çok açık olmadığı için sanırım farklı sonuçlar yazmışız. Fakat aynı çıktıyı alsaydık sizin ki daha performanslı çalışırdı sanırım. Test etmek için şöyle bir şey yaptım. 

    SET STATISTICS TIME ON ;
    GO
    
    select 
     C.CustomerID,
    MAX(ilk.Toplam) AS ilkT,MAX(son.Toplam) AS sonT,
    MAX(son.Toplam) - MAX(ilk.Toplam) AS Fark
    
    from [Sales].[Customer] c
    outer apply (select top(1) [OrderDate], TotalDue  from [Sales].[SalesOrderHeader] o WHERE C.CustomerID = o.CustomerID order by OrderDate,SalesOrderNumber asc) ilk(Tarih, Toplam)
    outer apply (select top(1) [OrderDate], TotalDue  from [Sales].[SalesOrderHeader] o WHERE o.CustomerID = c.CustomerID order by OrderDate desc) son(Tarih, Toplam)
    
    WHERE (ilk.Toplam)  IS NOT NULL
    GROUP BY CustomerID
    ORDER BY CustomerID

    Benim ki ni de aşağıda ki gibi değiştirdim : 

    SET STATISTICS TIME ON
    GO 
    
    SELECT 
    DISTINCT C.CustomerId,
    FIRST_VALUE(TotalDue) OVER(PARTITION BY C.CustomerId ORDER BY H.OrderDate ASC,H.SalesOrderNumber ASC ) AS ilkDeger,
    LAST_VALUE(TotalDue) OVER(PARTITION BY C.CustomerId ORDER BY H.OrderDate ASC,H.SalesOrderNumber DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS SonDeger,
    LAST_VALUE(TotalDue) OVER(PARTITION BY C.CustomerId ORDER BY H.OrderDate ASC,H.SalesOrderNumber DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
    -
    FIRST_VALUE(TotalDue) OVER(PARTITION BY C.CustomerId ORDER BY H.OrderDate ASC,H.SalesOrderNumber ASC ) AS FArk
    FROM [Sales].[Customer] AS c INNER JOIN [Sales].[SalesOrderHeader] AS H ON c.CustomerID = H.CustomerID
    ORDER BY C.CustomerID ASC
    
    Bu şekilde çalıştırdım.

    27 Eylül 2019 Cuma 17:32
  • Evet, Last_Value, First_Value kullanımına güzel bir ornek olmuş, elinize sağlık. 

    Soruyu soran arkadaşların, sonra sorularıyla ilgilenip geri bildirim yapmaması uzucu :(



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    28 Eylül 2019 Cumartesi 16:45