2017-03-24 8 views
1

SQL Server 2014を使用しています。タイムスタンプの付いたレコードのリストがあります。時間は、ここで時間ごとのレコード数をカウントし、合計レコード数が値よりも多くなった時間をカウントするSQL

20は、私がこれまで持っているものだと言う、レコード数が一定数を超え、毎日どのように多くの時間をカウント:

select count(distinct datepart(hour, convert(datetime, OrderStateDate))) Count_HoursOver, 
    datepart(YEAR, convert(datetime, OrderStateDate)) Date_YEAR, 
    datepart(month, convert(datetime, OrderStateDate)) Date_MONTH, 
    datepart(day, convert(datetime, OrderStateDate)) Date_DAY 
from Reporting.dbo.Orders 
group by datepart(YEAR, convert(datetime, OrderStateDate)), 
    datepart(month, convert(datetime, OrderStateDate)), 
    datepart(day, convert(datetime, OrderStateDate)) 
having count(idscript) >= 20 

結果が正しくないと私が作ることができません返されるものとその理由の感覚HAVINGを間違って使用していますか?何かアドバイスをいただければ幸いです!

+1

時間数をカウントするのではなく、カウントを取得するために時間単位でグループ化してはいけませんか? – TZHX

+0

私の基準にどれくらいの時間が合っているか知りたいので、私は時間単位でグループ化しませんでした。だから毎日、合計数が限界を超えた時間は何時間ですか?私が数時間でグループ化すると、終わった時間のリストが得られますが、1日ごとのリストはありません。 –

答えて

0

あなたが一種のここ

2部構成の質問があり、私はあなたがタプル(RecordsPerHourを返すクエリを作成することができ毎時あるレコードの数

をカウントしたいと思い、HOUR 、YEAR、MONTH、DAY)は次のように

SELECT 
    count(*) as RecordsPerHour, 
    datepart(hour,convert(datetime,OrderStateDate)) as Date_HOUR, 
    datepart(year,convert(datetime,OrderStateDate)) as Date_YEAR, 
    datepart(month,convert(datetime,OrderStateDate)) as Date_MONTH, 
    datepart(day,convert(datetime,OrderStateDate)) as Date_DAY 
FROM Reporting.dbo.Orders 
GROUP BY 
    datepart(year,convert(datetime,OrderStateDate)), 
    datepart(month,convert(datetime,OrderStateDate)), 
    datepart(day,convert(datetime,OrderStateDate)), 
    datepart(hour,convert(datetime,OrderStateDate)) 

その後、毎日どのように多くの時間をカウントし、そのレコード数与えられた数を超え、少なくとも20件のオーダーが含まれているだけで時間をフィルタリングするHAVING句を使用して、ネストされたクエリに質問の最初の部分からのクエリを使用し、これを行うには20

を言います。外側のクエリに

、少なくとも20個のオーダーとその日の時間数を決定する(年、月、日)によってグループ:時間に

SELECT 
    count(*) as HoursWithAtLeast20Orders, 
    Date_YEAR, 
    Date_MONTH, 
    Date_DAY 
FROM 
    (SELECT 
     datepart(hour,convert(datetime,OrderStateDate)) as Date_HOUR, 
     datepart(year,convert(datetime,OrderStateDate)) as Date_YEAR, 
     datepart(month,convert(datetime,OrderStateDate)) as Date_MONTH, 
     datepart(day,convert(datetime,OrderStateDate)) as Date_DAY 
    FROM Reporting.dbo.Orders 
    GROUP BY 
     datepart(year,convert(datetime,OrderStateDate)), 
     datepart(month,convert(datetime,OrderStateDate)), 
     datepart(day,convert(datetime,OrderStateDate)), 
     datepart(hour,convert(datetime,OrderStateDate)) 
    HAVING count(*) >=20) as t 
GROUP BY 
    Date_YEAR, 
    Date_MONTH, 
    Date_DAY 
+1

それは私が必要とするものです。ありがとう!ある時点でネストされたクエリを試しましたが、あなたが上記で提供したものから内側に出てきました。再度、感謝します! –

0

まずラウンド次いで日

にラウンド
SELECT 
    count(*) as [hours with 20+ Orders], 
    dateadd(day, datediff(day,'20000101',dt_hour_rounded),'20000101') as dt_day_rounded  
FROM (
    SELECT 
     count(*) as OrdersInHour, 
     dateadd(hour, datediff(hour,'20000101',OrderStateDate),'20000101') as dt_hour_rounded 
    FROM Reporting.dbo.Orders 
    GROUP BY dateadd(hour, datediff(hour,'20000101',OrderStateDate),'20000101') 
) t 
GROUP BY dateadd(day,datediff(day,'20000101',dt_hour_rounded),'20000101') 
WHERE OrdersInHour >= 20 
関連する問題