2017-10-14 151 views
1

我正在與SAP HANA一起工作。以下是我的計算視圖的一些示例數據。我期望的結果是計算列最後一位老師。SQL計算列

examplary...

我有2名學生。有一個學生最後一次見過老師的日期。對於每個學生,我想用sql語句計算上次看到的老師。任何想法?

+0

請。標記DBMS(MySQL,MS SQL Server,Oracle等),您正在使用。 –

+0

添加一些示例數據和所需的結果。 –

+0

延遲窗口函數,如果你使用的是支持它的dbms – GurV

回答

0

在MySQL,目前不支持窗口的功能,你可以試試這個:

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; 

使用窗口功能,我們可以用一個做掉聯接和略微簡化爲以下幾點:

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

請嘗試以下查詢。通過爲每個studentIdGroup LastSeen

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

該功能組每studentId和命令行:

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

這將返回每個記錄,可能來自每個學生,這恰好有最後一次看到的時間,這是給定學生的最大時間。可能不是OP想要的。 –

0

可以使用Row_Number()功能通過列oracle分貝這樣得到LastRecord。然後你可以使用選擇每組第一排where語句where rn = 1

UPDATE 如果你想選擇表中的所有行,那麼你就可以加入你的表這個選擇的語句是這樣的:

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,感謝您的關注,我更新了我的答案 –