2017-10-14 13 views
1

Je travaille pour la première fois avec SAP HANA. Voici quelques exemples de données de ma vue calculée. Mon résultat souhaité est la colonne calculée dernier enseignant.Colonne SQL calculée

examplary...

J'ai 2 étudiants. Il y a une date à laquelle un étudiant a vu un enseignant pour la dernière fois. Pour chaque étudiant, je veux calculer le dernier enseignant vu avec une déclaration SQL. Une idée?

+0

pls. tag SGBD (MySQL, MS SQL Server, Oracle, etc.) que vous utilisez. –

+0

ajoutez quelques exemples de données et le résultat souhaité. –

+0

Fonction de fenêtre de décalage si vous utilisez un dbms qui le supporte – GurV

Répondre

0

MySQL, qui ne prend pas en charge les fonctions de la fenêtre, vous pouvez essayer ceci:

SELECT 
    t1.*, 
    t3.TeacherID AS last_teacher 
FROM yourTable t1 
INNER JOIN 
(
    SELECT studentID, MAX(LastSeen) AS max_last_seen 
    FROM yourTable 
    GROUP BY studentID 
) t2 
    ON t1.studentID = t2.studentID 
INNER JOIN yourTable t3 
    ON t2.studentID  = t3.studentID AND 
     t2.max_last_seen = t3.LastSeen; 

Utilisation des fonctions de la fenêtre, nous pouvons en finir avec l'une des jointures et de simplifier légèrement à ce qui suit:

SELECT 
    t1.StudentID, 
    t1.TeacherID, 
    t1.LastSeen, 
    t2.TeacherID AS last_teacher 
FROM 
(
    SELECT StudentID, TeacherID, LastSeen, 
     MAX(LastSeen) OVER (PARTITION BY StudentID) AS max_last_seen 
    FROM yourTable 
) t1 
INNER JOIN yourTable t2 
    ON t1.StudentID  = t2.StudentID AND 
     t1.max_last_seen = t2.LastSeen; 
0

Essayez la question ci-dessous.

SELECT * 
FROM table 
WHERE last_seen IN (
    SELECT Max(last_seen) 
    FROM table 
    GROUP BY student_id 
) 
+0

Cela retournerait chaque enregistrement, potentiellement de chaque étudiant, qui se trouve avoir une dernière fois vu qui était le maximum pour un étudiant donné. Probablement pas ce que veut le PO. –

0

Vous pouvez utiliser la fonction Row_Number() pour obtenir LastRecord par colonne dans oracle db comme ceci:

Select * from 
(
    select 
    ROW_NUMBER() OVER (PARTITION BY studentId ORDER BY LastSeen desc) as rn, 
    studentId, 
    TeacherId 
    from yourTable 
) 
where rn = 1; 

Cette fonction des groupes tous les ordres et studentId lignes par LastSeen colonne pour chaque studentIdGroup. Ensuite, vous pouvez sélectionner la première ligne pour chaque groupe à l'aide où la déclaration where rn = 1

MISE À JOUR si vous voulez sélectionner toutes les lignes de votre table, vous pouvez vous joindre à cette sélection satement avec votre table comme ceci:

select * from yourTable t 
join 
(
    Select * from 
    (
    select 
     ROW_NUMBER() OVER (PARTITION BY studentId ORDER BY LastSeen desc) as rn, 
     studentId, 
     TeacherId 
    from yourTable 
) 
    where rn = 1 
) s 
on t.studentId = s.studentId; 
+0

@TimBiegeleisen, Merci pour votre attention, j'ai mis à jour ma réponse –