SQL Saturday #100 Brazil
SELECT *
FROM (VALUES('Fabiano Neves Amorim'),
('Sr.Nimbus – SQL Server MVP'),
('[email protected] | @mcflyamorim'),
('http://blogfabiano.com')) AS Tab("Sobre mim:")
Windowing Functions no SQL
Server 2012
Patrocinadores
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
Set Based vs Row by Row
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
Clausula OVER
função de agregação + partition by + order by + window frame
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 tbLancamentos
GO
PARTITION BY
ORDER BY
Default
WINDOW
FRAME
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()
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
Window Frame, duas “janelas”
USE NorthWind
GO
SELECT OrderID,
CustomerID
FROM Orders
WHERE CustomerID IN
(1,2)
ORDER BY CustomerID
Window Frame, “janelas” coexistem
Window Frame – First_Value
SELECT OrderID, CustomerID,
FIRST_VALUE(OrderID) OVER(PARTITION BY CustomerID
ORDER BY OrderID) AS FirstOrderID
FROM Orders
WHERE CustomerID IN (1,2)
Window Frame – Last_Value
SELECT OrderID, CustomerID,
LAST_VALUE(OrderID) OVER(PARTITION BY CustomerID
ORDER BY OrderID) AS FirstOrderID
FROM Orders
WHERE CustomerID IN (1,2)
Window Frame – Last_Value
…LAST_VALUE(OrderID)
OVER(PARTITION BY CustomerID ORDER BY OrderID
ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING) AS FirstOrderID ...
Demonstração
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
SELECT LAG(Col1) OVER MinhaWin AS Col1 FROM
Tabela1
WINDOW MinhaWin AS (ORDER BY Coluna1 ROWS 2
PRECEDING)
* não standard
Recursos
 Treinamentos Sr.Nimbus
 http://www.srnimbus.com.br/
 Artigos simple-talk:
 http://tinyurl.com/SQLSat100-WF1
 http://tinyurl.com/SQLSat100-WF2
 Artigos meu blog:
 http://blogfabiano.com/category/windowsfunctions/
 Video SQL Bits IX
 Dave Ballantyne
http://www.sqlbits.com/Sessions/Event9/Whats_n
ew_in_Denali-TSQL
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:")
?
Download

WINDOW MinhaWin - Blog