3

テーブル構造は次のとおりです。

tbl応募者:

applicantID (index)   |     ApplyingForYear (nvarchar) 
------------------------------------------------------
1                           2013/14
11                          2013/14
13                          2013/14
12                          2013/14
15                          2013/14
21                          2012/13

tblApplicantSchools_shadow :

id (index)   |    applicantID    |    updated (datetime)   |   statusID (int)   |   schoolID (int)
-----------------------------------------------------------------------------------------------------
1                   11                  2012-09-24 00:00:00.000     3                   2
1                   13                  2012-10-24 00:00:00.000     4                   2
2                   15                  2012-11-24 00:00:00.000     3                   4
3                   13                  2012-03-24 00:00:00.000     4                   3
4                   12                  2012-09-24 00:00:00.000     4                   1
5                   21                  2012-11-03 00:00:00.000     5                   2
6                   11                  2012-09-04 00:00:00.000     4                   4

私がする必要があるのは:

  • ApplyingForYear'2013/14'を持つすべての応募者を取得しますtblApplicants
  • statusID4の
  • 2 回以上表示されたとしても、1 回だけカウントしたいtblApplicantschools_show
  • 個別の応募者の数をグループ化します (上記のとおり) -updated日付の列で (週でグループ化)

したがって、上記のサンプル データに基づいて、3 つの行が表示されるはずです ( ApplicantID13 が 2 回表示され、1 回だけ必要なため)。

結果は次のようになります。

    Datesubmitted              TotalAppsPerWeek
    -------------------------------------------------------
    2012-10-24 00:00:00.000    1
    2012-09-24 00:00:00.000    1
    2012-09-04 00:00:00.000    1

これは私がこれまでに持っているものです-しかし、結果は3行ではなく4行になります:(

select  
   DATEADD(ww,(DATEDIFF(ww,0,[tblApplicantSchools_shadow].updated)),0) AS Datesubmitted,
   count(DISTINCT [tblApplicantSchools_shadow].applicantID) as TotalAppsPerWeek 
FROM tblApplicants  
INNER JOIN tblApplicantSchools_shadow 
      ON tblApplicantS.ApplicantID = tblApplicantSchools_shadow.applicantID
WHERE 
     ApplyingForYear = '2013/14' 
     AND [tblApplicantSchools_shadow].statusID = 4
GROUP BY 
     DATEADD(ww, (DATEDIFF(ww, 0, [tblApplicantSchools_shadow].updated)), 0)

そして、ここにフィドルがあります:http://sqlfiddle.com/#!3/3aa61/42

4

1 に答える 1

3

あなたのタイトルから、各応募者から必要な 1 つの行は、最小のid. ROW_NUMBER()次の関数を使用して、申請者 ID ごとに 1 つの行を選択できます。

;with latestApplication AS
(
    SELECT DATEADD(ww,(DATEDIFF(ww,0,[tblApplicantSchools_shadow].updated)),0) 
               AS Datesubmitted,
        [tblApplicantSchools_shadow].applicantID,
        ROW_NUMBER() OVER (PARTITION BY [tblApplicantSchools_shadow].applicantID 
                           ORDER BY [tblApplicantSchools_shadow].id) 
            AS rn
    FROM tblApplicants  
    INNER JOIN tblApplicantSchools_shadow 
        ON tblApplicantS.ApplicantID = tblApplicantSchools_shadow.applicantID
    WHERE ApplyingForYear = '2013/14' 
    AND [tblApplicantSchools_shadow].statusID = 4
)
select Datesubmitted, COUNT(1) AS TotalAppsPerWeek
FROM latestApplication
WHERE rn = 1
group by Datesubmitted
order by Datesubmitted DESC

http://sqlfiddle.com/#!3/3aa61/57

于 2013-03-13T17:37:32.973 に答える