2011-02-15 67 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年