Bom dia!
Vi no blog do Vitor Fava (http://vfava.wordpress.com/) uma recomendação de sites com desafios de T-SQL.
Perfeita ocasião pra voltar a dar mais uma revisada na codagem!
Decidi então trazer alguns deles pra cá por dois motivos:
1) Incentivar você, leitor (se tiver afim é claro) de praticar (e reforçar o que você já sabe);
2) Transmitir uma forma de pensar diferente ou nova de lógica;
O crédito pelas questões é do site http://beyondrelational.com/, que é bem legal, e recomendo, pra quem curte desafios que visite sem medo de ser feliz (a não ser que você já seja um coder-monster, aí no caso você iria só pra brincar mesmo).
Toda semana, por períodos irregulares, irei trazer os desafios que eu acho interessante e postar aqui.
Quem quiser postar uma solução, pode fazê-lo no site ou aqui mesmo, pra gente compartilhar pontos de vista diferentes. Eu postarei a minha solução comentada sobre o exercício em outro post pra não alongar esse aqui demais. Provavelmente esse final de semana! Já tá pronto aqui, só aguardando a oportunidade 🙂
Vamos ao enunciado:
Link da questão original: http://beyondrelational.com/modules/19/tsql-beginners/297/tsql-beginners-challenge-1-find-the-second-highest-salary-for-each-department.aspx?tab=info
Enunciado: O desafio é listar os funcionários com o segundo maior salário de cada departamento. Se dois funcionários tiverem o mesmo salário, você precisa listá-los também!
Regra: Sua solução deve funcionar no SQL Server 2005 ou superior, e a ordernação deve ser feita pelo salário.
Restrição: A solução deve ser apresentada em apenas uma consulta que comece com WITH ou SELECT. Ou seja, pode usar CTE? Pode tio(a). Pode usar tabela temporária, etc? Não tio(a), não pode.
Dados de amostra
EmployeeID EmployeeName Department Salary ----------- --------------- --------------- --------- 1 T Cook Finance 40000.00 2 D Michael Finance 25000.00 3 A Smith Finance 25000.00 4 D Adams Finance 15000.00 5 M Williams IT 80000.00 6 D Jones IT 40000.00 7 J Miller IT 50000.00 8 L Lewis IT 50000.00 9 A Anderson Back-Office 25000.00 10 S Martin Back-Office 15000.00 11 J Garcia Back-Office 15000.00 12 T Clerk Back-Office 10000.00
Resultado esperado
EmployeeID EmployeeName Department Salary ----------- --------------- --------------- --------- 10 S Martin Back-Office 15000.00 11 J Garcia Back-Office 15000.00 2 D Michael Finance 25000.00 3 A Smith Finance 25000.00 7 J Miller IT 50000.00 8 L Lewis IT 50000.00
Código da amostra:
DECLARE @Employees TABLE( EmployeeID INT IDENTITY, EmployeeName VARCHAR(15), Department VARCHAR(15), Salary NUMERIC(16,2) ) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('T Cook','Finance', 40000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('D Michael','Finance', 25000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('A Smith','Finance', 25000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('D Adams','Finance', 15000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('M Williams','IT', 80000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('D Jones','IT', 40000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('J Miller','IT', 50000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('L Lewis','IT', 50000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('A Anderson','Back-Office', 25000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('S Martin','Back-Office', 15000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('J Garcia','Back-Office', 15000) INSERT INTO @Employees(EmployeeName, Department, Salary) VALUES('T Clerk','Back-Office', 10000)
Algumas dicas pra quem se sentir perdido (só leia isso se sentir bastante dificuldade):
1) Usar CTE (Common Table Expressions) é a forma mais fácil de fazer, na minha opinião;
2) Dê uma olhada nas Windows Functions, são o santo graal pra Ad-hoc Queries e vai resolver fácil essa questão .
3) Não veja a solução no site (existe a mesma disponível lá na aba solutions). Tente fazer pra aprender . Não é nada complexo e não exige muita leitura.
A solução será postada em outro post com explicações (farei isso final de semana ou na segunda). Se quiser ver a resposta (de novo, não recomendo) que ainda não tem as explicações mais atenciosas que farei na próxima postagem, clique aqui!
Até mais!
Pingback: Reposta do Desafio #1 T-SQL, Ranking Functions (Row_number,Rank e Rank Dense) | Radialog