Temat: [SQL Server 2014] Inne od spodziewanego działanie funkcji...

W Oracle z powodzeniem stosowałem poniższą konstrukcje, by otrzymać wartość pola udf_nazwa_pliku dla np. najstarszej albo najnowszej daty.

MAX(udf_nazwa_pliku_akt) KEEP (DENSE_RANK LAST ORDER BY eventdate) ostatni_plik


Na SQL Server chciałem otrzymać najświeższą cenę produktu dla ostatniej (najświeższej) daty

last_value([cena]) OVER (partition by [produkt_id] ORDER BY [data])


Przy powyższym zapisie dostaje inny wynik dla każdego kolejnego wiersza z tym samym produktem.
Nie wiem czemu
partition by [produkt_id]
"nie rozciąga" okna na wszystkie krotki z tym samym produkt_id

Prawidłowo działa dopiero zapis:

LAST_VALUE([CENA_ZM]) OVER (ORDER BY [ObjectId3])
ale tutaj nie wygląda na to że zwrócona kwota została wytypowana bo data była najświeższa/najstarsza tylko prawdopodobnie dlatego, że fizycznie rekord był pierwszy/ostatni.

https://msdn.microsoft.com/en-us/library/hh231517.aspx

Rank() over ... działa w identyczny sposób jak na bazie Oracle a w tym przypadku chyba nie do końca, lub coś robię źle...

Temat: [SQL Server 2014] Inne od spodziewanego działanie funkcji...

Wyszukałem, że LAST_VALUE sprawia problemy które znikają, gdy po order by dodamy
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW


Z kolei FIRST_VALUE działa bez dodatkowych ustaleń.

gdyby kogoś interesowało od połowy strony są komentarze na ten temat

https://technet.microsoft.com/en-us/library/hh231517(v=...

"Oswojenie" last_value
https://www.youtube.com/watch?v=zulLKbTK_j0

Ostatecznie poniższy SQL zwraca to co chciałem:


select [DataVersionId]
,max(start) start
,[ObjectId3],
min(last_cena) last_cena
from
(SELECT [DataVersionId]
,[Start]
,[ObjectId3]
,first_VALUE([CENA_ZM]) OVER (partition by [ObjectId3] ORDER BY [start] desc) last_cena
FROM [migr_local].[dbo].[Temp]
) sd
group by [DataVersionId]
,[ObjectId3]


Gdyby ktoś chciał uniknąć funkcji analitycznych to można też tak:

SELECT t1.[DataVersionId]
,t1.[Start]
,t1.[ObjectId3]
,t1.[CENA_ZM]
FROM [migr_local].[dbo].[Temp] t1
join
(SELECT [ObjectId3], max(start) last_date
FROM [migr_local].[dbo].[Temp]
group by [ObjectId3]) ost_data
on t1.[ObjectId3]=ost_data.[ObjectId3] and t1.Start=ost_data.last_date
Ten post został edytowany przez Autora dnia 14.07.16 o godzinie 17:09

Następna dyskusja:

[SQL Server 2014] jak przek...




Wyślij zaproszenie do