1

我是一名新手程序员,我也在学习提出正确的问题并成为一名更好的作家,所以如果你发现我提出问题或解释的方式有任何问题,请评论一些提示。开始了:

我有一个用户的请求,他希望我编写一个代码,该代码获取申请特定学习计划(例如:“信息系统”)的申请人被接受的期限。

我不确定这是否是错误的数据或到底发生了什么,但在 QC 中,用户遇到了一个学生,他两次申请了特定的学习计划(2011 年夏季和 2012 年夏季)并且两次都被接受。当用户 QC 时,出于某种原因,Summer 2011 显示在前端。用户已要求我仅显示该学习计划的最新学期。我找不到任何标志或替代品来缩小我的搜索范围。

有谁知道我可以做什么(我可以使用什么逻辑)来选择最新的术语。该表确实有 lastchangedate 列,但我不确定我是否可以使用它,因为学生可以申请 20 个不同的学习计划。

更多信息:

我会将我的代码放入现有的存储过程中。此外,我将在表格中插入此术语信息。

这是我的代码在逻辑上的样子:

DECLARE @MiscID int......

SELECT @MiscID = sys_miscinfotablesdetailsid from sys_miscinfotablesdetails 
where      attributename = 'Start Term for Billing'....

INSERT INTO sss_studentstudyprogramsmisc
(  
AttributeValue.......
)

SELECT 

T.Name [AttributeValue],....

FROM

SMS_StudentsInstance i
inner join.....(blah blah)

where WHERE sspm.AttributeValue IS NULL 

如果我需要提供更多信息,请告诉我。我会很感激这一点。我问了我团队的高级工程师,他告诉我:“做一些日期时间与学期日期时间的比较。我不知道你如何在当前的夏季学期中完成它。祝你好运:)”。

谢谢!

4

2 回答 2

1

您可以使用关键字按ORDER BY学生申请的术语DESC进行降序排序,然后您可以使用 限制记录数TOP 1。网上有很多例子供大家参考。

于 2013-02-08T22:46:45.773 回答
1

请参阅以下查询。通过使用公用表表达式,您可以row_number()向源表添加一列,并使用该列指定您只需要第一个。

create table #t ( id int, string nvarchar(10))

insert into #t values (1, '1')
insert into #t values (1, '1')
insert into #t values (2, '2')
insert into #t values (3, '3')
insert into #t values (4, '4')

create table #newt ( id int, string nvarchar(10))

;with oldt as 
(
   select id, string, 
   rnum = row_number() over(partition by id, string order by id, string) 
   from #t
)
insert into #newt
select id, string
from oldt where rnum = 1

ETA:诀窍是partition by应该包含定义唯一性的所有字段。这order by是必需的,但在这种情况下并不重要。但是,如果您有主键字段或更改/版本日期字段,则可以将其用于最新的:order by primaryId desc.

ETA2:以下是如何将其应用于您的 SP 的概括:

DECLARE @MiscID int......

SELECT @MiscID = sys_miscinfotablesdetailsid from sys_miscinfotablesdetails 
where      attributename = 'Start Term for Billing'....

-- Wrap existing select in a CTE.
-- CTE needs to start with a semicolon
-- and needs to be placed above the INSERT
;WITH cte AS (

  SELECT 

  T.Name [AttributeValue],....
     -- Add the row_number function column
     -- Include all fields you are selecting in the partition by
     -- Find appropriate order by 
     rnum = row_number() over(partition by t.Name, ... order by lastchangedate desc)
  FROM

  SMS_StudentsInstance i
  inner join.....(blah blah)

  WHERE sspm.AttributeValue IS NULL 
)
INSERT INTO sss_studentstudyprogramsmisc
(  
AttributeValue.......
)
-- Simple select from the CTE instead 
SELECT AttributeValue, ...
FROM cte
-- ...but only for the first record
WHERE rnum = 1
于 2013-02-08T22:54:00.170 回答