2013-07-01 60 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

在不存在主鍵的,這是不可能的。有PK嗎? – Paparazzi

+0

沒有PK,但可以使用Name,Village和Date中的組合鍵。 – TomEaton

+0

那你如何訂購?如果沒有PK或指定順序的唯一密鑰,則無法執行任何基於訂單的分析。不保證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彈出對於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