2015-11-04 170 views
1

我想寫一個查詢,執行以下操作:計數天凡記錄未記錄SQL

  • 組的結果由'key'
  • 和的次數的'device id'沒有記錄'data'

這是樣本數據

sample data

最終的輸出應該是這樣的:

| Key | Count of Missed Data | 
| 14 |   123   | 
| 124 |   356   | 

哪裏count of missed data是一個'device id'沒有在最近365天記錄'data'天數。

**注意:每'key'可能有500 'device id'。每次在這一年的某個日曆日,這些設備中的一個設備不會記錄'data',並計算按鍵分組的「錯過的數據」點的總數。

請詢問您是否有任何問題。謝謝您的幫助!

約翰

每下面的建議,這是我現在運行的代碼。批評?

Select 
a.descr AS 'Community', 
a.meter_type AS 'Meter Type', 
sum(a.misseddaysperdevice) as [Count of Missed Days] 
From 
    (
    Select 
     fmr.subdivisionkey, 
     sub.descr, 
     meter_type, 
     365-count(distinct(convert(varchar, fmr.read_date, 112))) as misseddaysperdevice 
    From 
     FactMeterRead fmr 
     INNER JOIN DimSubdivision sub on sub.subdivisionkey = fmr.subdivisionkey 
    Where 
     fmr.read_date > getdate()-364 
    Group By 
     fmr.SubdivisionKey, sub.descr, fmr.meter_num, meter_type 
    ) a 
Group By 
    a.descr, meter_type 
Order By 
    [Count of Missed Days] DESC 

回答

1

像這樣的東西應該這樣做:

select key, 365 - count(distinct(cast(date as date))) as [Count of Missed Data] 
from MyTable 
where date > getdate() - 365 
group by key 

編輯:總結的漏天計數所有設備對於給定的關鍵,試試這個:

select key, sum(MissedDaysPerDevice) as [Count of Missed Data] 
from (
    select key, 365 - count(distinct(cast(date as date))) as MissedDaysPerDevice 
    from MyTable 
    where date > getdate() - 365 
    group by key, device 
) a 
group by key 
+0

我想我可能有在我的問題上有點不清楚。每個密鑰將有多個「設備ID」。每個鍵可以有500個「設備ID」。我需要統計每個設備在整個一年中每天沒有記錄「數據」的次數。這是否有意義? – johnwonderbread

+0

@johnwonderbread查看我的編輯 – RedFilter

1

好,錯過的天數是365天的天數。這是比較容易計算的,因此:

select key, count(distinct cast(date as date)) as days_present, 
     365 - count(distinct cast(date as date)) as days_absent 
from t 
where date >= dateadd(day, -364, cast(getdate() as date)) 
group by key; 
+0

我想我的問題可能有點不清楚。每個密鑰將有多個「設備ID」。每個鍵可以有500個「設備ID」。我需要統計每個設備在整個一年中每天沒有記錄「數據」的次數。 這有意義嗎? – johnwonderbread

+0

@johnwonderbread。 。 。我非常肯定,這就是這個查詢所做的事情(雖然我毫不猶豫地承認它可能會有一個錯誤)。 –

1

我不喜歡硬編碼365天....問題的時間的1/4 ......

  declare @asOfDate date = getdate() 
     declare @start date 
     set @start = dateadd(year, -1, @asOfDate) 

     select sumDevice.[Key], sum(sumDevice.MissingDaysCount) as MissingDaysCount 
     from ( 
      select mt.[Key], 
      mt.[device id], 
      datediff(day, @start, @asOfDate) - isnull(count(distinct cast(mt.[Date] as date)), 0) 
              as [MissingDaysCount] 
      from myTable mt 
      where mt.[date] between @start and dateadd(day, 1, @asOfDate) 
      group by mt.[key], 
        mt.[device id]) as SummaryKey 
     group by sumDevice.[Key] 
     order by sumDevice.[Key] 
+0

謝謝。問題 - 如果某些日期有多個數據條目(例如:上午10點和下午11點),這是否會影響此查詢的結果?我只想讓它在沒有閱讀的每一天都計算一次,而不考慮一天的時間。 – johnwonderbread

+0

不,一天內的多個日期條目會以「count(distinct cast(mt。[Date] as date))」每天被摺疊爲1「)」 – JBrooks