2014-09-29 14 views
5

Birisi bana bu sorgunun tam olarak ne yaptığını anlamama yardımcı olabilir mi? Lamak söylediği gibiZararlı SQL sorgusu etrafında aklımı karıştırmaya çalışıyorum

with x as (
    select 
    Sedol, 
    max(id) max_id, 
    Max(ValueDate) max_valuedate 
    from 
    Prices 
    group by 
    Sedol 
) select 
    Sedol, 
    max(max_id) over (partition by Sedol, max_valuedate) PriceId 
from 
    x; 

rağmen, bu

SELECT Sedol, MAX(Id) PriceId FROM Prices GROUP BY Sedol 

SQL Fiddle

sadece eşdeğer olacak değil herhangi bir yol göremiyorum:
SELECT pp.Sedol 
    ,MAX(MAX(Id)) OVER (
     PARTITION BY pp.Sedol 
     ,MAX(pp.ValueDate) 
     ) PriceId 
FROM Prices pp 
GROUP BY pp.Sedol 
+0

yapamazsınız agrega bir toplama işlevi içinde. Bu bir sözdizimi hatası atmalıdır. –

+0

Eh, maalesef değil. Bunu ben yazmadım, sadece ne yapması gerektiğini anlamaya çalışıyorum. –

+0

@JaazCole: * "Bir toplu işlev içinde toplanamazsınız." * [Görünüşe göre, yapabilirsiniz] (http://sqlfiddle.com/#!6/4c971/1), en azından bir pencere işlevi. –

cevap

1

Bence Lamak daha önce sql hakkında bir açıklama yaptı, ben anlamak için bir örnek gönderiyorum. Her iki sqls da aynı sonuçları verir. sql sunucusunda kodunun altına yapıştırın kopyalayıp deneyin:

declare @Prices table (Id int, ValueDate datetime, Sedol int) 

Insert into @Prices values (1,'2014-09-06' ,200), 
(2,'2014-09-07' , 100), 
(3,'2014-09-08' , 100), 
(4,'2014-09-09' , 100), 
(5,'2014-09-10' , 300), 
(6,'2014-09-11' , 300), 
(7,'2014-09-12' , 100), 
(8,'2014-09-13' , 200), 
(9,'2014-09-14' , 200), 
(10,'2014-09-15' , 200) 

Select * from @Prices 

-- Your SQL 
SELECT pp.Sedol 
    ,MAX(MAX(Id)) OVER (
     PARTITION BY pp.Sedol 
     ,MAX(pp.ValueDate) 
     ) PriceId 
FROM @Prices pp 
GROUP BY pp.Sedol 

-- Simple SQL mentioned by Lamak 
SELECT Sedol, MAX(Id) PriceId FROM @Prices GROUP BY Sedol 

Resultset:

enter image description here