sql saturday #100 brazil windowing functions no sql server 2012 select * from (values('fabiano...

17
SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('[email protected] | @mcflyamorim'), ('http://blogfabiano.com')) AS Tab("Sobre mim:") Demo, Scripts.zip

Upload: isabela-inocencio

Post on 07-Apr-2016

231 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

SQL Saturday #100 Brazil

Windowing Functions no SQL Server 2012

SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('[email protected] | @mcflyamorim'), ('http://blogfabiano.com')) AS Tab("Sobre mim:")

Demo, Scripts.zip

Page 2: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Patrocinadores

Page 3: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Agenda

Set Based vs Row by Row O que são windows functions? Novas funções implementadas no SQL2012 O que ainda falta? Window Frame Demos Perguntas e respostas

Page 4: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Set Based vs Row by Row

Page 5: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

O que são windows functions?

• Similar as funções de agregação• Retornam um valor a partir de dados

agregados• Padrão SQL:2008• Suportado no Oracle, DB2, PostegreSQL• It’s all about Sets

Page 6: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Clausula OVER

SELECT ID_Conta, DT_Lancamento, VL_Lancamento,SUM(VL_Lancamento)

OVER(PARTITION BY ID_Conta ORDER BY DT_Lancamento RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM tbLancamentosGO

PARTITION BYDefault

WINDOW FRAME

ORDER BY

função de agregação + partition by + order by + window frame

Page 7: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

SQL Server 2012

Suporte quase completo a clausula OVER() Order by Partition By Window frame

Novas functions:• LEAD(), LAG(), FISRT_VALUE(), LAST_VALUE(),

CUME_DIST(), PERCENT_RANK(), PERCENTILE_CONT(), PERCENTILE_DISC()

Page 8: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame

[ROWS | RANGE] BETWEEN <Start expr> AND <End expr>

<Start expr>UNBOUNDED PECEDING: Window inicia na primeira linha da partição.CURRENT ROW: Window inicia na linha atual.<unsigned integer literal> PRECEDING ou FOLLOWING

<End expr>UNBOUNDED FOLLOWING: Window termina na última linha da partição.CURRENT ROW: Window termina na linha atual.<unsigned integer literal> PRECEDING ou FOLLOWING

Page 9: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame, duas “janelas”

USE NorthWindGOSELECT OrderID, CustomerID FROM Orders WHERE CustomerID IN (1,2) ORDER BY CustomerID

Page 10: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame, “janelas” coexistem

Page 11: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame – First_ValueSELECT OrderID, CustomerID, FIRST_VALUE(OrderID) OVER(PARTITION BY CustomerID ORDER BY OrderID) AS FirstOrderID FROM Orders WHERE CustomerID IN (1,2)

Page 12: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame – Last_ValueSELECT OrderID, CustomerID, LAST_VALUE(OrderID) OVER(PARTITION BY CustomerID ORDER BY OrderID) AS FirstOrderID FROM Orders WHERE CustomerID IN (1,2)

Page 13: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Window Frame – Last_Value…LAST_VALUE(OrderID) OVER(PARTITION BY CustomerID ORDER BY OrderID

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS

FirstOrderID ...

Page 14: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Demonstração

Page 15: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

O que ainda falta no SQL2012?

Funções: FIRST, retorna o primeiro valor de um grupo ordenado

MAX(Cidade) KEEP (DENSE_RANK FIRST ORDER BY SUM(Valor_Pedido))* LAST: último valor de um grupo ordenado

MIN(Cidade) KEEP (DENSE_RANK LAST ORDER BY SUM(Valor_Pedido))* NULLs FIRST, NULLs LAST

OVER(ORDER BY Coluna1 NULLs FIRST) Interval (Year, Month, Day, Hour, Minute, Second) Window Clause

* não standard

SELECT LAG(Col1) OVER MinhaWin AS Col1 FROM Tabela1WINDOW MinhaWin AS (ORDER BY Coluna1 ROWS 2 PRECEDING)

Page 17: SQL Saturday #100 Brazil Windowing Functions no SQL Server 2012 SELECT * FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('fabiano.amorim@srnimbus.com.br

Dúvidas e brindes!

?

SELECT "Sobre Mim:" FROM (VALUES('Fabiano Neves Amorim'), ('Sr.Nimbus – SQL Server MVP'), ('[email protected]|@mcflyamorim'), ('http://blogfabiano.com')) AS Tab("Sobre mim:")