按间隔30分钟对查询进行分组

时间:2013-07-29 01:42:04

标签: grouping

我正在尝试查询以30分钟为间隔对客户记录进行分组,同时总计30分钟间隔内的客户数量以及每个客户花费的总金额。

我是新手,我正试着把它带到头上。

我使用的是Microsoft SQL 2005。

以下是我的主表格的示例:

Cust_ID (Prime key), Date_time (Time of order), Price, and Sales_Tax

特定日期的时间间隔应介于每小时的0-2930-59之间。

我已经想出如何根据日期范围简单地选择记录。但我在分组功能方面遇到了麻烦。

1 个答案:

答案 0 :(得分:0)

    SELECT SUM(price)            AS price_sum,
       SUM(tax)                  AS tax_sum,
       COUNT(DISTINCT cust_id)   AS cust_count,
       CONVERT(varchar(13), time_of_order, 120) 
        + CASE 
             WHEN DATEPART(minute, time_of_order) < 30 THEN 'A'
             ELSE 'B'
          END           AS time_chunk_hash
  FROM Sales
       GROUP BY CONVERT(varchar(13), time_of_order, 120) 
                    + CASE 
                         WHEN DATEPART(minute, time_of_order) < 30 THEN 'A'
                         ELSE 'B'
                      END
       ORDER BY CONVERT(varchar(13), time_of_order, 120)  
                  +  CASE 
                        WHEN DATEPART(minute, time_of_order) < 30 THEN 'A'
                        ELSE 'B'
                     END

一个工作示例位于:http://sqlfiddle.com/#!3/794ae/12

计算出的time_chunk_hash用于对输出进行排序和分组,如下所示:

 2013-07-28 15A
 2013-07-29 15B

这表示,例如,7月28日下午3点后的前半个小时,然后是下半年。

这是一种呈现相同查询的可读方式

SELECT SUM(price)                  AS price_sum,
       SUM(tax)                    AS tax_sum,
       COUNT(DISTINCT cust_id)     AS cust_cnt,
       time_chunk_hash
   FROM 
   (
      SELECT price,
             tax,
             cust_id,
             CONVERT(varchar(13), time_of_order, 120)
              + CASE 
                   WHEN DATEPART(minute, time_of_order) < 30 THEN 'A'
                   ELSE 'B'
               END           AS time_chunk_hash
        FROM Sales
   ) HASHED
     GROUP BY time_chunk_hash
     ORDER BY time_chunk_hash

一个工作示例位于:http://sqlfiddle.com/#!3/794ae/11