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

sql sql-server count

1860 просмотра

2 ответа

347 Репутация автора

У меня есть таблица Attendanceв моей базе данных.

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 раз . Поэтому я хочу 4 в качестве результата. Как добиться этого в SQL Server?

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

Автор: prograshid Источник Размещён: 31.01.2014 04:35

Ответы (2)


3 плюса

29693 Репутация автора

Вы можете сделать это с помощью рекурсивного 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

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

Автор: Hart CO Размещён: 31.01.2014 05:00

4 плюса

10690 Репутация автора

Решение

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

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

   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

Автор: praveen Размещён: 31.01.2014 05:06
32x32