1

私は初心者のプログラマーであり、正しい質問をしてより良いライターになることも学んでいるので、私の質問や説明の仕方に何か問題があることに気付いた場合は、いくつかのヒントをコメントしてください. どうぞ:

特定の学習プログラム (例:「情報システム」) に応募した応募者が受け入れられた期間を取得するコードを書いてほしいというユーザーからの要求があります。

これが悪いデータなのか、それとも正確に何が起こったのかはわかりませんが、ユーザーが QC を行っているときに、特定の学習プログラムに 2 回 (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

以下のクエリを参照してください。共通テーブル式を使用すること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 に答える
1

を使用して、降順ORDER BYのキーワードを使用して学生が適用した用語で並べ替え、次に を使用してレコード数を制限できます。ウェブ上には、両方の例がたくさんあります。DESCTOP 1

于 2013-02-08T22:46:45.773 に答える