2014-01-31 3 views
2

У меня есть таблица Attendance в моей базе данных.Как подсчитать большинство последовательных вхождений значения в столбце в SQL Server

Date  | Present 
------------------------ 
20/11/2013 | Y 
21/11/2013 | Y 
22/11/2013 | N 
23/11/2013 | Y 
24/11/2013 | Y 
25/11/2013 | Y 
26/11/2013 | Y 
27/11/2013 | N 
28/11/2013 | Y 

Я хочу считать наиболее последовательное вхождение значения Y или N.

Например, в приведенной выше таблице Y происходит 2, 4 & 1 раз. Поэтому я хочу в качестве результата. Как достичь этого в SQL Server?

Любая помощь будет оценена по достоинству.

+0

Какая версия SQL Server вы используете? –

+0

@ astander- 'SQL Server 2008' – prograshid

+0

Как вы хотите это сделать? В StoredProc/UDF или просто TSQL. –

ответ

4

Попробуйте это: -

Разница между последовательной датой будет оставаться постоянным

Select max(Sequence) 
    from 
    (
    select present ,count(*) as Sequence, 
     min(date) as MinDt, max(date) as MaxDt 
     from (
       select t.Present,t.Date, 
        dateadd(day, 
           -(row_number() over (partition by present order by date)) 
           ,date 
         ) as grp 
       from Table1 t 
      ) t 
    group by present, grp 
)a 
    where Present ='Y' 

SQL FIDDLE

3

Вы можете сделать это с помощью рекурсивных CTE:

;WITH cte AS (SELECT Date,Present,ROW_NUMBER() OVER(ORDER BY Date) RN 
       FROM Table1) 
    ,cte2 AS (SELECT Date,Present,RN,ct = 1 
       FROM cte 
       WHERE RN = 1 
       UNION ALL 
       SELECT a.Date,a.Present,a.RN,ct = CASE WHEN a.Present = b.Present THEN ct + 1 ELSE 1 END 
       FROM cte a 
       JOIN cte2 b 
       ON a.RN = b.RN+1) 
SELECT TOP 1 * 
FROM cte2 
ORDER BY CT DESC 

Демо: SQL Fiddle

Обратите внимание, дата-й в демке была изменена из-за формат, который вы выложили даты в вашем вопросе.

+1

Вы избили меня до него .. молодцы :-) –

+1

+1. Спасибо, это то, что я хочу :) – prograshid

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