在三个表格中选择最大的数据

4

我无法得到正确的结果。我有3个表:

table: Aluno
id_aluno    nome
1           Bruno
2           Carlos

table: Serie
id_serie    id_aluno    descricao
1           1           Tipo A
2           1           Tipo B
3           2           Tipo A

table: Treino
id_treino   id_serie    data
1           1           2015-12-10
2           2           2015-12-12
3           3           2015-12-10

我希望得到以下结果:

nome     descricao    data
Bruno    TIPO B       2015-12-12
Carlos   TIPO A       2015-12-10       

问题在于GROUP BY子句应该有"id_aluno"列,但这不是具有日期的表的外键。它们之间有一个中间表。我不知道怎么做。 希望您能帮助我。

抱歉,选择最大日期。 - Thiago Braga
最好在问题中包含SQL,即使它不完全有效。 - Gordon Linoff
4个回答

1
您可以基于现有键加入表格,但随后需要指定仅基于人员的最大日期,类似于以下内容:
SELECT
    a.nome,
    s.descricao,
    t.data
FROM Aluno a
    JOIN Serie s
        ON s.id_aluno = a.id_aluno
    JOIN Treino t
        ON t.id_serie = s.id_serie
WHERE t.data = ( --get max date by person, excluding serie
                SELECT MAX(t1.data)
                FROM Aluno a1
                JOIN Serie s1
                    ON s1.id_aluno = a1.id_aluno
                JOIN Treino t1
                    ON t1.id_serie = s1.id_serie
                WHERE s1.id_aluno = s.id_aluno 
               )

使用此查询时,请确保Treino中的data值是唯一的,否则结果集中可能会出现重复。 - Y.B.

0

您可以在任何From表的列上使用Group By,包括那些通过Join链接的表。您可以使用Join链接尽可能多的表。

Select Aluno.nome, Serie.descricao, Max(Treino.data) As data
From Aluno
Inner Join Serie On Serie.id_aluno = Aluno.id_aluno
Inner Join Treino On Treino.id_serie = Serie.id_serie
Group By Aluno.nome, Serie.descricao

好的,考虑到 MS SQL 的注释,可以这样编写:

Select nome, descricao, data
From (
    Select Aluno.nome, Serie.descricao, Treino.data,
        RANK() OVER (Partition By Aluno.nome Order By Treino.data Desc) AS Ordinal
    From Aluno
    Inner Join Serie On Serie.id_aluno = Aluno.id_aluno
    Inner Join Treino On Treino.id_serie = Serie.id_serie
) Ranked
Where Ordinal = 1

顺便问一下,如果您在Treino中有另一条记录:4, 1, 2015-12-125, 2, 2015-12-12呢? 您需要一种方法来优先处理Serie。比如这样:
Select nome, descricao, data
From (
    Select Aluno.nome, Serie.descricao, Treino.data,
        ROW_NUMBER() OVER (Partition By Aluno.nome Order By Treino.data Desc, Serie.descricao) AS Ordinal
    From Aluno
    Inner Join Serie On Serie.id_aluno = Aluno.id_aluno
    Inner Join Treino On Treino.id_serie = Serie.id_serie
) Ranked
Where Ordinal = 1

我已经尝试过这个了,但它返回了每个系列的所有最大日期(因为它在group by子句中),而我需要每个学生的所有最大日期。 - Thiago Braga

0

这里我使用了多个公共表达式来完成它。

脚本

WITH CTE
AS
(
    SELECT TOP 2 id_Treino,id_serie,data
    FROM Treino
    ORDER BY DATA DESC
), 
cte2 
as
(
    SELECT a.nome,s.descricao,c.data
    FROM aluno AS a
    INNER JOIN Serie AS s
    ON a.id_aluno = s.id_aluno
    INNER JOIN cte AS c
    ON s.id_serie = c.id_serie
)
SELECT * FROM cte2;

输出:

nome        descricao       DATA
------------------------------
Bruno       Tipo B      2015-12-12
Carlos      Tipo A      2015-12-10

0
请使用此查询。

Select a.nome, s.descricao, t.data
FROM Aluno a
join Serie s on (s.id_aluno = a.id_aluno)
join Treino t on (t.id_serie = s.id_serie)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接