# Desafio - Herbert Nordson
## Grupo 1
#### 1 - Quantos bruxos nascidos-trouxa (Muggle-born) ou mestiços (Half-blood) existem em cada casa (house)? Ordene-os decrescentemente e limite a busca em quatro (4) registros. Observe que não temos certeza sobre blood_status de alguns bruxos. Mas, nós estamos buscando aqui nessa questão pelos bruxos que são Muggle-born, Half-blood ou Muggle-born or Half-blood.
Resposta:
Resposta se um dos filtros for escrito como ‘Muggle-born or Half-blood’
``` sql
select distinct house, count (blood_status)
from harry_potter
where
(blood_status = 'Muggle-born' or blood_status = 'Half-blood')
group by house
order by count(blood_status) desc limit 4;
```
#### 2 - Qual é a casa que tem a menor quantidade de sangues-puro (Pure-blood), assumindo apenas aqueles que têm-se certeza? Remova, também, aqueles casos que a casa (House) seja nula e o (Blood Status) seja nula.
``` sql
select distinct house, count (blood_status)
from harry_potter
where
blood_status = 'Pure-blood' and
house notnull and
blood_status notnull
group by house
order by count(blood_status) asc limit 1;
```
#### 3 - Quantas pessoas existem na família Weasley (assuma pessoas com algum nome de Weasley)?
``` sql
select count (name)
from harry_potter
where
name LIKE ('%Weasley');
```
#### 4 -Existe alguém na família Weasley que não seja ruivo (Red)?
``` sql
select count (name)
from harry_potter
where
name LIKE ('%Weasley') and
Hair_colour <> 'Red';
```
#### 5 - Todo bruxo consegue aprender o feitiço do patrono, um feitiço de proteção que toma forma de um animal. É um feitiço complexo e nem todos os bruxos possuem um patrono. Existem pessoas que possuem o mesmo animal patrono (patronus)? Remova os casos em que os valores sejam Unknown (do inglês, desconhecido), Non-corporeal (Não possui forma animal) ou None (nenhum) e ordene-os pela quantidade decrescentemente, limitando nos 3 maiores resultados.
``` sql
select Patronus, count (*)
from harry_potter
where
(patronus <> 'Unknown' and patronus <> 'Non-corporeal' and patronus <> 'None')
group by patronus
order by count(*) desc limit 3;
```
#### 6 - Utilizando apenas uma consulta com possibilidade de subqueries, responda: busque pelos quatro bruxas ou bruxos que possuem nomes que deram origem ao nome das casas de Hogwarts (House). Remova aqueles que sejam da espécie fantasma (Ghost). A resposta deve conter o sobrenome, o nome e a espécie.
``` sql
select distinct unnest (string_to_array(name,' ')) as sobrenome, name, species from harry_potter
where
(
name like ('%Gryffindor') or
name like ('%Slytherin') or
name like ('%Ravenclaw') or
name like ('%Hufflepuff')
) and species = 'Human'
limit 4;
```
#### 7 - Existiam bruxos que não eram da casa (house) Sonserina (Slytherin) que eram leais ao Lord Voldemort? Se existiram, qual são seus nomes? Desconsidere aqueles que não estão associados a nenhuma casa. A Resposta deve conter apenas o nome desses bruxos.
``` sql
select name from harry_potter
where
house <> 'Slytherin' and
loyalty like ('%Lord Voldemort%');
```
## Grupo 2
#### 1 - A Batalha de Hogwarts foi uma intensa batalha em que vários bruxos morreram. Esta batalha ocorreu no dia 2 de maio (2 May) de 1998. Busque pelas quantidade de mortos nesta batalha entre aqueles que lutavam por Albus Dumbledore (Dumbledore's Army ou Albus Dumbledore) ou a Ordem da Fênix (Order of the Phoenix) versus aqueles que lutavam a favor de Lord Voldemort ou eram comensais da morte (Death Eaters), inclui-se também o nome Tom Marvolo Riddle que é o verdadeiro nome de Lord Voldemort. A resposta deve conter apenas os nomes, as casas e as lealdades. Dica: a busca por Dumbledore's Army pode ser feita da seguinte forma Dumbledore''s Army, ou seja com duas aspas simples ao pesquisar usando LIKE ou =.
``` sql
select name, house, loyalty from harry_potter
where
death like ('2 May, 1998') and
(loyalty like ('%Albus Dumbledore%') or loyalty like ('%Dumbledore''s Army%') or loyalty like ('%Order of the Phoenix%')) or
(loyalty like ('%Lord Voldemort%') or loyalty like ('%Death Eaters%') or loyalty like ('%Tom Marvolo Riddle%'))
;
```
#### 2 - A primeira profecia de Sibila Trelawney é uma famosa profecia que colocou em dúvida quem seria o herói que teria poder para derrotar o grande vilão, Lord Voldemort. Provavelmente os bruxos não tinham um banco de dados tão interessante quanto o nosso mas a profecia tinha alguns requisitos que curiosamente alguns destes podem ser validados pelo dataset, a profecia dizia que um menino teria as seguintes características:
ser do gênero masculino.
seus pais tinham desafiado Voldemort três vezes e sobreviveram.
ele teria um poder que Voldemort era incapaz ou não queria compreender.
nascido nos últimos dias de julho de 1980, ano em que a profecia foi feita (possivelmente 29, 30 ou 31).
se mais de uma pessoa nascesse que satisfizer os requisitos, o próprio Voldemort iria escolher a quem acabaria por se referir.
Sua meta é encontrar nomes que poderiam satisfazer nossa vontade de descobrir quem poderia ser o herói.
Observação: Bom, como dizia o ditado: O inimigo do meu inimigo é meu amigo. Podemos assumir que aliados a Albus Dumbledore ou a Order of the Phoenix (Ordem da Fênix) eram também inimigos de Voldemort. Então isso pode ser um bom indicativo para tentar identificar nosso(s) herói(s).
Com base nesses requisitos quem são os possíveis heróis? A resposta deve conter apenas o nome do bruxo.
``` sql
select name from harry_potter
where
gender like 'Male' and
(birth like ('%29 July, 1980%') or
birth like ('%30 July, 1980%') or
birth like ('%31 July, 1980%'))
;
```
#### 3 - Busque por todos os trabalhos (job) e separe-os individualmente e por fim, ordene-os por quantidade descrecente, além disso, filtre-os por aqueles que possuem acima de 2. Lembre-se um personagem pode ter zero ou mais trabalhos e àqueles maiores que 1 são separados por | (barra vertical entre espaços); Cuidado: existe uma armadilha nessa pergunta: na resposta deve existir apenas trabalhos distintos.
``` sql
select * from (
select unnest(String_to_array(job, ' | ')) as trabalho, count(*) from harry_potter
group by trabalho
order by count(*) desc
) as trabalho
where trabalho.count > 2;
```
#### 4 - Busque por todos aqueles que entram nessas restrições:
Nasceram em Setembro September (birth);
Não faleceram (death);
Não possuem nomes iguais àqueles achados na questão 7 (utilize subquery);
Possuem lealdade associada a alguém (loyalty);
Que seu patrono não seja Unknown nem Non-corporeal;
Que possuam alguma casa (house);
Sejam do gênero feminino (gender);
A resposta deve conter os nomes das bruxas:
``` sql
select name from harry_potter
where
birth like ('%September%') and
death is null and
loyalty is not null and
patronus <> 'Unknown' and patronus <> 'Non-corporeal' and
gender = 'Female' and
house is not null;
```
## Grupo 3
#### 1 - Todas proposições abaixo PRECISAM ser executadas em uma só consulta podendo utilizar subconsultas.
#### 1A - Busque por todos os nomes de bruxos e quebre as palavras a fim de encontrarmos cada palavra usada como nome;
``` sql
select split_part(name, ' ', 1) as nome from harry_potter
group by nome limit 5;
```
#### 1B - Agora, agrupe os nomes a fim de encontrar a quantidade de vezes que o certo nome é repetido. (Lembre-se, existem pessoas com famílias, então espera-se repetição de nomes (que apareçam número maior do que 1));
```sql
select unnest (string_to_array(name, ' ')) as nome, count(*) from harry_potter
group by nome
order by count(*) limit 5;
```
#### 1C - Ordene-as palavras usadas como nome pela quantidade de repetições;
``` sql
select unnest (string_to_array(name, ' ')) as nome, count(*) from harry_potter
group by nome
order by count(*) desc limit 5;
```
#### 1D - Filtre por todos aqueles nomes que tiveram 4 ou mais repetições;
```sql
select *
from
(select unnest (string_to_array(name, ' ')) as nome, count(*) from harry_potter
group by nome
order by count(*) desc limit 5) as nova_tabela
where
nova_tabela.count >= 4;
```