如何仅在表中过滤第一个外观

时间:2013-03-13 17:29:18

标签: sql sql-server sql-server-2008

这是表结构:

tblApplicants

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
  • tblApplicants为“2013/14”的所有申请人
  • statusID为4
  • 我只想计算一次 - 即使它们在tblApplicantschools_show
  • 中出现两次或更多次
  • 对不同申请人的数量进行分组(根据上述情况) - 按updated日期列(按周分组)

因此,根据上面的示例数据,应该有3行,(因为ApplicantID 13出现两次,我只想要他一次)。

这是结果的样子:

    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

这是我到目前为止 - 但它导致4行,而不是3行:(

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

1 个答案:

答案 0 :(得分:3)

从你的标题来看,我假设每个申请人所需的一行是id最小的一行。您可以使用ROW_NUMBER()函数为每个申请人ID选择一行:

;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