2017-10-12 6 views
1

n時間で単純なグループ化が可能ですか? 数分、関連する質問が見つかりましたが、何時間もかかりません。T-SQLグループn時間

いくつかのデータをオフセットして8時間分グループ化する必要があります。

したがって、最初の8時間は00:00 - 08:00ではなく、22:00(昨日) - 06:00(今日)です。

これを1時間ごとにグループ化して貼り付けました。 どうすればいいですか? アドバイスありがとうございます。

答えて

2

DATEADD/DATEDIFFトリックを使用して、8時間間隔でグループ化することができます。

あなたは、この場合に

  • は午後12時30分に22時半をシフトする2時間を追加し、しかしオフセットを追加する必要があります。または07:30戻る09:30
  • 8時間間隔でグループ化する(0-8,8-16,8-24)
  • 2を減算して00:00を22:00に戻す、または丸みを帯びた8時

六時にスクリプト例

DECLARE @foo table (foo smalldatetime, bar int); 

INSERT @foo (foo, bar) 
VALUES 
    ('2017-10-11 21:00', 1), 
    ('2017-10-11 22:00', 2), 
    ('2017-10-11 23:00', 3), 
    ('2017-10-12 01:00', 4), 
    ('2017-10-12 03:00', 5), 
    ('2017-10-12 05:00', 6), 
    ('2017-10-12 07:00', 7), 
    ('2017-10-12 08:00', 8); 

SELECT 
    SUM(bar), 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0) 
FROM 
    @foo 
GROUP BY 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0); 
+0

ありがとうございました – Bogu

0

私は(あなたが提供しなければならない)どちらもデータの入力や出力を知らないが、ここではいくつかの一般的な方法です。

単純なテーブル(SimpleTable)2列を持つ:販売販売製品と数量の時間:今

SELECT SellingTime, Qunatity, 
     CASE WHEN DATEPART(hh, SellingTime) >= 22 AND DATEPART(hh, SellingTime) < 6 THEN 1 
      WHEN DATEPART(hh, SellingTime) >= 6 AND DATEPART(hh, SellingTime) < 14 THEN 2 
      ELSE 3 END AS NumberOfOrder 
FROM SimpleTable 

22-6などの間の時間のために1:今すぐ

SellingTime    | Quantity 
2013-01-02 08:43:22.011 | 4 
2013-02-12 12:32:12.001 | 14 
etc. 

は、我々は日付ごとに番号を発注追加されます、あなたがする必要があるすべては​​和Quantityによってグループにある:

*の代わりに、あなたが最初のクエリを入れて
SELECT NumberOfOrder, SUM(Quantity) FROM (*) 

関連する問題