2011-02-15 68 views
0

我有一個名爲新兵表具有包括第一最後列。 第一個最後一個列一起是主鍵,分別代表招募人員的名字和姓氏。 列是招募人員犯下的一年。請注意,同一班級可能會有多名新成員,即具有相同的類別值。SQL查詢,以便從過去5年中選擇所有記錄

我想顯示最近一堂課的所有記錄 - 不管它可能是什麼 - 以及前四個班/年的記錄。我真的不想硬編碼一系列特定年份,因爲每當有新的課程/年份出現時,我都會手動更改它。

任何幫助表示讚賞。如果我的描述過於模糊,請告訴我。

編輯:我只是使用MySQL/Apache的朋友

+2

你可以請張貼一些示例記錄嗎? – Matten 2011-02-15 16:54:53

+0

沒有必要,問題解決了。感謝您對任何情況的關注。 – 2011-02-17 18:01:44

回答

1

使用第一+最後的PK是指一個人不能被招募不止一次。這也阻止了第二個John Doe在另一個已經在前一年招聘時招聘。

select r.* 
from 
(
    # The 5 most recent classes 
    select class 
    from recruits 
    group by class 
    order by class desc 
    limit 5 
) c 
inner join recruits r on r.class = c.class 
order by class desc, `first`, `last` 

我想你的意思是過去5年的數據,而不是從當前的上次5歷年目前

0

既然你沒有提供特定的SQL Server,你可以試試這個(應該很多RDBMS工作):

select * 
    from recruits where class in 
    (select distinct class from recruits order by recruits desc limit 2) 
+0

我正在使用MySQL客戶端/服務器版本5.1.41。我的查詢中收到以下錯誤消息:_#1235 - 此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查詢'_無論如何,感謝您的幫助。 – 2011-02-17 17:55:11

0

在大多數數據庫,如

SELECT first, last, class 
    FROM (SELECT first, 
       last, 
       class, 
       dense_rank() over (order by class) rank_of_class 
      FROM recruits) 
WHERE rank_of_class <= 5 

將返回最後5個類值的所有信息。

+1

在tsql或pl:sql中,您將需要使用dense_rank,否則您將陷入排名之間的差距 – Robb 2011-02-15 17:31:36

+0

@Robb - 極好的一點。編輯我的答案,使更改 – 2011-02-15 18:38:17

+0

MySQL版本5.1.41顯然不支持您的查詢;我得到這個錯誤信息:_#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在靠近'(按類排序)rank_of_class FROM recruits'時使用正確的語法。WHERE rank_of_class <'在第5行_感謝您花時間回答我的問題。 – 2011-02-17 17:59:06

0

聽起來像你neeed類似:

Select 
    * 
From 
    recruits 
Where 
    class between DatePart(yy, getdate()) and DatePart(yy, getdate()) - 4 

也許能夠根據什麼你使用你的數據庫上獲得更好一點的答案。

這是來自sql server的transact sql。

1

假設您的存儲年爲2006,或2011和您使用TSQL

select 
    First, Last, Class 
From 
    recruits 
where 
    class > datepart(yy,getdate())-5 

這將讓你的人誰加入後2006年