2013-07-01 2 views
-1

Я ищу запрос в T-Sql для подсчета количества последовательных дат, назад, где поп-то же самое, начиная с последней даты и останавливаясь, когда есть пробел в дате ,Как считать последовательные даты

Это пример данных:

Name village Population Date 
Rob  village1 432  01/07/2013 
Rob  village2 432  30/06/2013 
Rob  village3 432  29/06/2013 
Rob  village3 432  28/06/2013 
Rob  village3 432  27/06/2013 
Rob  village3 430  26/06/2013 
Rob  village3 430  25/06/2013 
Rob  village3 430  24/06/2013 
Rob  village3 430  23/06/2013 
Rob  village3 425  22/06/2013 
Rob  village3 422  21/06/2013 
Rob  village3 422  20/06/2013 
Rob  village3 411  19/06/2013 
Harry Village1 123  01/07/2013 
Harry Village2 123  30/06/2013 
Harry Village3 122  29/06/2013 
Pat  Village1 123  01/07/2013 
Pat  Village2 123  30/06/2013 
Pat  Village3 123  29/06/2013 
Pat  Village4 100  20/06/2013 
Tom  Village1 123  01/07/2013 
Tom  Village2 123  30/06/2013 
Tom  Village3 123  29/06/2013 
Tom  Village4 123  28/06/2013 

Я бы ожидать, чтобы получить следующие результаты:

Rob 5 
Harry 2 
Pat 3 
Tom 3 

Данные должны быть более сложными, но будут 1000-х строк, 100 на человека и группы поп-музыки с последовательными датами, но мне нужен только первый набор последовательных дат с одинаковой поп-музыкой, начиная с последней.

+0

При отсутствии первичного ключа это не представляется возможным. Есть ли ПК? – Paparazzi

+0

Нет ПК, но может использоваться составной ключ от имени, деревни и даты. – TomEaton

+0

Тогда как бы вы их заказали? Без ПК или уникального ключа, который назначает заказ, вы не можете выполнять какой-либо анализ на основе заказа. Оператор select не гарантирует возврата строк в том порядке, в котором они присутствуют в таблице. Если вам нужно поставить дату в заказе, а затем удивить - вы получите дату в этом порядке. – Paparazzi

ответ

1
with dd as 
(
    select distinct * from table 
); 
    select name, max(count) + 1 
    from 
    (
     select t1.name, t1.village, t1.pop, count(*) as count 
     from dd t1 
     join dd t2 
     on t2.village = t1.village 
     and t2.pop = t1.pop 
     and t2.pop = t1.pop 
     and t2.date = dateadd(day,-1,t1.date) 
     group by t1.name, t1.village, t1.pop 
    ) dates 
    group by name 
+0

Спасибо за попытку. - Извините за мое невежество, я вижу, что меня проголосовали. Я просто попрошу модераторов удалить сообщение. Проблема с вышеупомянутым решением заключается в возвращении нескольких результатов на одного игрока, если у них есть группы поп-музыки, которые одинаковы. IE pop одинаково в течение 2 дней, затем увеличивается, а затем другая группа из 3 одинакова .. вернет 2 ответа. – TomEaton

+0

Затем добавьте деревню. Приложите себя. У вас не было повторяющихся дат в выборке. Просто сделайте выделение, чтобы устранить дубликаты. – Paparazzi

1
;with a as 
(
select name, village, population, date, cast(date as datetime) + dense_rank() over(partition by Population, name order by date desc) grp 
from <your table> 
), b as 
(
select name, village, population, date, dense_rank() over (partition by name order by grp desc) rk 
from a 
) 
select name, count(distinct date) from b 
where rk = 1 
group by name 
Смежные вопросы