2013-03-13 7 views
3

Вот структура таблицы:Как фильтровать первое появление в таблице только

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 из «2013/14» в tblApplicants
  • имеет statusID из 4
  • Я только хочу, чтобы посчитать их разы - даже если они появляются в два раза или более в tblApplicantschools_show
  • группы число различных заявителей (в соответствии с указанными выше) - по колонку updated даты (сгруппированная по неделе)

так на основе выборочных данных выше, должно быть 3 ро ws, которые выходят, потому что 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) 

И вот Fiddle: http://sqlfiddle.com/#!3/3aa61/42

+0

Если оба ряда для ApplicantID 13, где в течение одной недели, это будет просто вопрос добавления ApplicantID к группе, и, вероятно, потребуется добавить его к выбору. Однако, поскольку существуют разные значения для Datesubmitted, каково правило, для которого Datesubmitted и какие значения TotalAppsPerWeek вы хотите? –

+0

Я предполагаю теперь из названия «первое появление в таблице», что самый маленький 'id' - это строка, которую нужно сохранить. Верный? –

ответ

3

Из вашего названия я предполагаю, что одна строка, которую вы хотите от каждого претендента, является самой маленькой id. Вы можете выбрать одну строку для каждого заявителя ID с функцией ROW_NUMBER():

;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

+0

отлично lc. ответ на мою голову, поэтому у меня есть кое-что, что я могу прочитать на разных частях, которые я не знаю (с, раздел, row_number() и т. Д.), Но он отлично работает - спасибо! – kneidels

+0

FYI 'WITH' определяет CTE (Common Table Expression). Вы должны иметь возможность искать документы для этого и хорошо читать –

Смежные вопросы