Suponha que eu tenha uma tabela de alunos, contendo seu ID, série e estado:
-------------------------
| id | grade | state |
------------------------
| 1 | 83 | CA |
| 2 | 94 | TX |
| 3 | 92 | WA |
| 4 | 78 | CA |
E eu quero o ID dos alunos de cada estado com a nota mais alta (ex. 1, 2 e 3), como eu faria isso?
Eu sei como encontrar o máximo (pode fazer o produto cruzado (renomeando como R1 e R2) e então selecionar R1.grade < R2.grade para aqueles que não estão no topo, e subtrair isso do banco de dados original). Mas estou confuso sobre como fazer isso para cada estado.
Na verdade, não me sinto muito confortável com álgebra relacional, então, farei isso primeiro usando SQL padrão e depois usarei uma ferramenta chamada RelaX - calculadora de álgebra relacional 0.18.2 para fazer a tradução.
Primeiro, a tabela que você escreveu, vou chamá-la de alunos, defini-la e preenchê-la com:
O RelaX traduzirá isso em um conjunto de dados, representado pelas seguintes tuplas:
Para encontrar o que você procura, primeiro precisamos de uma tabela com tuplas no formato
(state, grade)
, tendo a nota máxima de cada estado. Essa consulta é feita, em SQL com umMAX(grade)
perstate
usando umGROUPs BY state
. Você escreveria assim:Em seguida, você precisa
JOIN
dessa tabela (que se chamamax_grades
) parastudents
aquela, e você faz isso comON
estados iguais e nota igual (ou seja: a nota máxima por estado) ...... e isso é traduzido pelo RelaX para a seguinte expressão e resposta de álgebra relacional:
NOTA 1:
Alternativo:
Se você não puder
GROUP BY
, você pode usar outra construção:Isso vai um pouco mais de acordo com o seu pensamento original, embora eu pessoalmente ache menos claro ...
A tradução para álgebra relacional é:
EDIT: não li com atenção e dei uma resposta para SQL, caso o pôster se interesse. Por favor, deixe-me saber se você não está interessado e então eu vou excluir.
SQL: Acho que usar uma tabela derivada funciona. Vamos chamar sua mesa de 'Alunos':