Fala pessoal!

neste vídeo mostro bem rapidamente como utilizar as Window Function com as funções de classificação do T-SQL. Vamos aprofundar um pouco no módulo seguinte!

Aqui está o código (retirei do Simple Talk e da apresentação do Fabiano no SQLSAT 100, as fontes estão logo em cima!)

--cria a base de dados
/*fonte:  https://www.simple-talk.com/sql/t-sql-programming/sql-server-2012-window-function-basics/ 
outras fontes: http://blogfabiano.com/?s=sql+saturday+100 */
USE TSQL2012;
GO
 
IF OBJECT_ID('RegionalSales', 'U') IS NOT NULL
DROP TABLE RegionalSales;
GO
 
CREATE TABLE RegionalSales
(
  SalesID INT NOT NULL IDENTITY PRIMARY KEY,
  SalesGroup NVARCHAR(30) NOT NULL,
  Country NVARCHAR(30) NOT NULL,
  AnnualSales INT NOT NULL
);
GO
 
INSERT INTO RegionalSales
  (SalesGroup, Country, AnnualSales)
VALUES
  ('North America', 'United States', 22000),
  ('North America', 'Canada', 32000),
  ('North America', 'Mexico', 28000),
  ('Europe', 'France', 19000),
  ('Europe', 'Germany', 22000),
  ('Europe', 'Italy', 18000),
  ('Europe', 'Greece', 16000),
  ('Europe', 'Spain', 16000),
  ('Europe', 'United Kingdom', 32000),
  ('Pacific', 'Australia', 18000),
  ('Pacific', 'China', 28000),
  ('Pacific', 'Singapore', 21000),
  ('Pacific', 'New Zealand', 18000),
  ('Pacific', 'Thailand', 17000),
  ('Pacific', 'Malaysia', 19000),
  ('Pacific', 'Japan', 22000);
GO
-----------------------------------------------------------------------------------------------------------------------------------
--sintaxe b�sica:

<window function> OVER
  (
    [ PARTITION BY <expression> [, ... n] ] --define a janela
    [ ORDER BY <expression> [ASC|DESC] [, ... n] ] --define a ordem dos dados dentro da janela
    [ ROWS|RANGE <window frame> ] --frame, ou moldura, define em quais linhas a fun��o � calculada
  )
go


---------------------------------------------------------------------------------------------------------------
--fun��es de RANKING:
--ranking functions:
--a janela � a tabela toda:
--ORDER BY OBRIGAT�RIO:
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales;
 go
 --------------------------------------------------------------
 --ordena��o diferente
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales
ORDER BY
  SalesGroup, Country;

 -------------------------------------------------------------
 --defini��o de janela: SALESGROUP
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  ROW_NUMBER() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS RowNumber,
  RANK() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS BasicRank,
  DENSE_RANK() OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS DenseRank,
  NTILE(3) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NTileRank
FROM
  RegionalSales;
------------------------------------------------------------
--utilizando fun��es de agrupamento em janelas:
--grouping functions:

SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup) AS CountryCount,--janela � SALESGROUP, contar quantos existem
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup) AS TotalSales, --soma total de vendas  por SALESGROUP
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup) AS AverageSales --m�dia por SALESGROUP
FROM
  RegionalSales
ORDER BY
  SalesGroup, AnnualSales DESC;

-----------------------------------------
--igual, menos colunas
SELECT DISTINCT
  SalesGroup,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup) AS AverageSales
FROM
  RegionalSales
ORDER BY
  TotalSales DESC;
 --------------------------------------------
 --AGRUPANDO E ORDENANDO
 --grouping with ordering: each grouping column is different!
 --duplicate are aggregated together
 /*
 The default setting for the ROWS/RANGE subclause is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 
 This means that, for each row in the partition, the window function is applied to the current row and the preceding rows only. 
 So aggregations don�t operate on the entire set of values within the partition, but only on the value in the current row and the previous rows, 
 as we saw in the example below.
 */

 --contagem a partir de dentro da janela, ordenando do maior valor de venda at� o menor, agregando da primeira linha at� a atual.
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS AverageSales
FROM
  RegionalSales  ;
------------------------------------------------------------------------------------------------
--PALAVRAS-CHAVE: PRECEDING -> anteriores, FOLLOWING -> seguintes
--CURRENT ROW -> linha atual
--UNBOUNDED -> sem limite, a partir da primeira ou at� a �ltima

--IGUAL com a defini��o de frame padr�o:
--RANGE considera valores iguais como o mesmo, GREECE e SPAIN, agregando apenas um deles:

 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  range between unbounded preceding and current row) AS AverageSales
FROM
  RegionalSales  ;
---------------------------------------------------------------------------
--ROWS considera cada linha como um valor a ser agregado, normalmente � o mais utilizado
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC 
  rows between unbounded preceding and current row) AS AverageSales
FROM
  RegionalSales  ;
-------------------------------------------------------------------------------------
--fa�a a agrega��o apenas com as 2 linhas anteriores:
--only the 2 preceding rows and current
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS 2 PRECEDING) AS AverageSales
FROM
  RegionalSales;
  ------------------------------------------
 --fa�a a agrga��o considerando a janela toda: 
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  COUNT(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS CountryCount,
  SUM(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS TotalSales,
  AVG(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS AverageSales
FROM
  RegionalSales;




 ------------------------------------------
 --FUN��ES ANAL�ICAS:
  --First/Last values - analytic functions
 --veja horizontalmente
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  FIRST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS HighestSales, -- ordene o valor do maior pro menor, ous seja, o primeiro � o maior, o �ltimo � o menor
  LAST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS LowestSales
FROM
  RegionalSales;

------------------------------
--todas as linhas da parti��o!
SELECT
  SalesGroup,
  Country,
  AnnualSales,
  FIRST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS HighestSales,
  LAST_VALUE(AnnualSales) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
      AS LowestSales
FROM
  RegionalSales;
 ----------------------------

 --LAG: valor de n linhas antes da atual
 --LEAD: valor de n linhas depois da atual
 SELECT
  SalesGroup,
  Country,
  AnnualSales,
  LAG(AnnualSales, 1) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS PreviousSale,
  LEAD(AnnualSales, 1) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NextSale
FROM
  RegionalSales;
  ----------------------------
  --tratando nulls:
   SELECT
  SalesGroup,
  Country,
  AnnualSales,
  LAG(AnnualSales, 1,0) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS PreviousSale,
  LEAD(AnnualSales, 1,0) OVER(PARTITION BY SalesGroup
    ORDER BY AnnualSales DESC) AS NextSale
FROM
  RegionalSales;



Abraços e Happy SQL Serving!

Aqueles que estão acostumados com o Linux, conhecem a facilidade de criar um arquivo com o comando TOUCH.

No Windows podemos usar o comando FSUTIL para fazer a mesma coisa.

Um arquivo dummy tem várias utilidades mas a principal é testar tempo de cópia entre um servidor e outro por exemplo!

Para criar um arquivo então utilize a seguinte sintaxe:
FSUTIL FILE CREATENEW <<Caminho e nome do arquivo>> Tamanho em Bytes

Cuidado para o tamanho que deve ser em Bytes!

Até a próxima pessoal!

 

Happy SQL Serving!

Fala galera, tudo bem por aí?

Sabe aquelas perguntas marotas que a gente tem mas nunca tem tempo pra brincar/testar? Resolvi fazer essa série de Não FAQs (ou perguntas não frequentemente feitas) para vermos o que acontece mesmo no Availability Groups.

Esta foi inspirada por uma pergunta no grupo do SQLManiacs no Whatsapp. Não conhece o SQLManiacs? Cadastre-se já aqui! – Não fazemos SPAM! #Paz

Já se perguntou o que acontece se você cria um arquivo de dados numa replica primária mas o caminho NÃO existe na replica secundária?

Confere aí:

Fiquem à vontade pra sugerir novas perguntas!

Abraço a todos e happy SQL SERVING!

 

É isso ae galera!

No dia 24 de Junho tivemos mais um SQL SATURDAY em terras brazucas. Desta vez foi em Caxias do Sul.
O pessoal da organização está de parabéns! O evento foi muito bem organizado, cheio de palestras sensacionais e é claro, ótimos coffees!

O pessoal que participou também está de parabéns! O evento não ficou vazio depois do almoço. Conseguimos perceber que o pessoal está bastante interessado e está comprometido. Isso é muito gratificante para todos!

Neste SQLSAT conversei sobre Opções de Alta Disponibilidade entre SQL SERVER e ORACLE. Os slides da minha palestra podem ser encontrados aqui.

 

Nos encontramos por aí.

Happy SQL Serving!

Fala SQL GEEKS, tudo certo?

Neste vídeo faço um review rápido sobre dois excelentes livros: Microsoft SQL SERVER 2014 Query Tuning and Optimization e High Performance SQL SERVER, ambos de Benjamin Nevarez e do evento SQL SERVER The Amazing Data que acontece dias 19 e 20 de Maio de 2017.

Deixo vocês com o vídeo logo abaixo:

E com os devidos links:

Happy SQL Serving guys!

 

 

Fala pessoal, tudo bem?

Nos dias 19 e 20 de Maio deste ano teremos um grande evento: o The Amazing Data. Na sexta-feira teremos um dia todo de workshop com ninguém menos que Benjamin Nevarez. Autor de livros de Performance Tuning e MVP Data Platform. No dia seguinte, sábado, teremos uma série de palestras a respeito de diversos assuntos em SQL SERVER. O evento foi concebido pelo meu grande amigo Vitor Fava, se quiser saber mais detalhes, acesse os links acima e este.

De qualquer forma, como muita gente faz corpo mole e fica inventando desculpas para não ir a eventos de tecnologia resolvi elencar algumas aqui para você não sair da sua zona de conforto, afinal, tudo está ótimo do jeito que está não é mesmo?

  1. Meu aniversário de casamento é em algum desses dias! – Comemore de noite, próximo!
  2. Poxa, são R$500,00 na Sexta-feira! – Não é custo zero fazer um evento desses, já pensou que alguém teve que pagar pro Benjamin vir ensinar um pouco do que ele sabe? Será que um dia de treinamento com um cara desses não compensa?O Sábado será no Vasco e  Pense na sua carreira!
  3. Pode ser que eu encontre alguém que precise da minha consultoria. – Realmente, trabalhar mais pode ser estressante, melhor ficar em casa!
  4. Pode ser que eu encontre outra vaga de emprego. – Sim, isso também é um processo estressante, imagina trocar de emprego? (Zona de Conforto is a bi$%#!)
  5. Mas e se tiver chovendo? Este link pode ajudar!
  6. Sou introvertido e minha carreira está muito bem onde está! – Networking é realmente uma das experiências mais traumáticas que eu conheço, melhor ficar em casa.
  7. Putz, mas o local é de difícil acesso? – Sério, em São Paulo a av. Paulista é de difícil acesso? Em que planeta você se esconde?
  8. Não sou de São Paulo, Marcelo! – Compre a passagem, a estadia e seja feliz! De novo, são dois dias de treinamento!
  9. Meu chefe não quer que eu vá! – Falta de visão para ele heim, melhor pensar em trocar de emprego, veja item 4.

Resumindo, o ser humano é mestre em criar desculpas. A Zona de conforto nos obriga a isso!

Mas quando alguém tem uma grande ideia como essa e consegue tirar ela do papel, temos que no mínimo respeitar e admirar a concepção e execução.

Aguardo todos nos dias do evento na av. Paulista para dois dias de imersão completa em SQL SERVER!

Abraço!

 

Boa noite SQL Geeks!

E neste final de semana aconteceu mais um SQLSATURDAY, em Joinville.

Joinville foi meu primeiro SQLSATURDAY como palestrante e palestrar lá é sempre um grande prazer, uma tradição de 3 anos já – Já foram 8 SATs e mais alguns outros eventos, to ficando velho!

E sim, todos estrangeiros que ouvem o nome JOINVille de uma cidade acham o máximo e realmente é!

É sempre muito gratificante rever os amigos da comunidade técnica e o mais legal dessa comunidade: Pode vir! Venha palestrar, venha ser voluntário, venha ajudar! A Comunidade com certeza já te ajudou – por que não ajudar de volta? “Pay it forward dude!”

Neste link você também encontra a palestra e o material que eu usei.

Abraço e até a próxima pessoal!

Fala pessoal.

No dia 04/04 teremos mais um Webcast internacional no SQLMANIACS. As 18:00 (BST) Andre Kamman apresentará sobre SQL SERVER e DOCKER. A apresentação toda será em ingles.

Não deixe de participar do nosso grupo: https://groups.google.com/forum/#!forum/sqlmaniacs
E não esqueça do nosso Facebook: https://www.facebook.com/groups/627908280680599/

André é arquiteto de soluções do SQL Server na CloudDBA, com sede na Holanda. Em papéis anteriores ele fez  trabalhos de DBA em 100 de servidores onde ele descobriu seu amor por Powershell e automação de processos em geral. Hoje, a maior parte do seu dia ele está construindo e ajustando cenários de migração de nuvens, sistemas OLTP, data warehouses e processos ETL e até mesmo o PDW ocasional. Foi mexendo tanto em automação que ele descobriu BIML. André é um MVP de SQL Server, líder do PASS holandês e organizador do SQL Rally Amsterdam e SQLSaturday Holanda.

Na data e hora do evento, acesse aqui para assistir:

 

Boa noite pessoal.

Neste vídeo gostaria de mostrar pra vocês o procedimento de recuperação manual de uma corrupção ocorrida no catálogo de metadados do SQL SERVER sem Backup!

Fonte deste artigo: http://www.sqlskills.com/blogs/paul/disaster-recovery-101-fixing-metadata-corruption-without-a-backup/ – Mestre Paul Randal

Repito a frase dele:

Se você não sabe o que está fazendo, PARE!
Você estará alterando tabelas de sistema do SQL SERVER, o que fará você perder o suporte da Microsoft no mesmo instante! Não somos responsáveis por quaisquer problemas que venham a acontecer! Faça por sua própria conta e risco!

Enjoy!

Happy SQL SERVING! 🙂

Copiando a frase do Christian Slater na série Mr. Robot (deve ser do primeiro episódio, primeira temporada): Exciting time in the World right now!

6634d1b3-3390-4f84-bf07-3739cc980b6e_text

DBAs do mundo todo! Perceberam isso?

O Banco de dados relacional não está mais só no servidor local, está em outros servidores, espalhados por aí.

A inteligência de negócios se uniu mais ainda com o papel do DBA.

Em breve veremos SQL SERVER de Produção sendo executados em Linux ou em qualquer outro SO, utilizando Docker.

A MS simplesmente liberou um monte de features que antes eram apenas Enterprise para a edição Standard do SQL SERVER 2016 com Service Pack 1.

Mais importante que tudo isso: Aprender sobre tudo isso hoje está mais fácil! A informação nunca esteve tão aberta e difundida como hoje.

Não parei de comparar o SQL SERVER com o concorrente vermelho (claro, a gente se diverte com isso :-)) mas tem muita coisa boa pra explorar no próprio SQL SERVER que nem tem igual no(s) outro(s).

Quer se tornar um DBA, não sabe por onde começar a pesquisar e aprender? Tem uma listinha que pode te ajudar:

  • Microsoft Virtual Academy: Cursos gratuitos ministrados por instrutores super qualificados;
  • Channel 9: Outra plataforma de ensino da Microsoft, pesquise por SQL SERVER;
  • PASS: Professional Association for SQL SERVER – Se não conhece, se associe, ontem – sério – pare o que você está fazendo e entre lá;
  • BLOGs: Tem muitos tanto em Portugues quanto em Inglês (atenção, aqui precisa de filtro, não acredite em tudo que lê);
  • Webcasts: Pelo menos duas vezes por mês tem algum de algum grupo brasileiro;
  • Grupos de discussão: Alguns no Brasil;
  • Eventos: SQL SATURDAY e outros, como o AMAZINGDATA 🙂 Temos diversos especialistas conversando sobre os mais variados temas;
  • Cursos oficiais e extra-oficiais – vários.

Bastante material né? E tem muito, muito mais.
De toda essa lista aí, o único que você paga é o último. Ou seja, só não estuda e não evolui quem não quer!

Abraço pessoal!

Marcelo