分组和分钟(嵌套选择)

时间:2014-08-21 16:31:07

标签: sql sql-server select group-by nested

我有关于需要按时间分类的选项列表时间戳的数据。对于每条记录,我有一个unitID,一个时间戳(以日期时间格式),一个位置和一个数量。与此相似。

UNIT  TIME   LOCATN   Picks
A    11:50    L4       2
B    11:51    m6       3
C    12:01    L8       4
B    12:03    A4       2
A    12:05    B6       3
C    12:06    C7       1
B    12:10    D7       4

我需要按时间间隔对这些进行分组 所以我想要的输出是

TIME    UNITS    picks
11:00    2         14
12:00    1         5

@ 11,它的2个单位,因为2个单位在那个小时开始,14个选择,因为订单A + B的所有选择都是15,而@ 12,只考虑C,因为它是在它开始的时候。

这是因为单位A + B在12:00之前开始,所以我不希望我的查询将它们计为两个不同的订单,在两个不同的时间"区域"

如您所见,我希望在单位开始时对它们进行分组,并计算该顺序的所有选择,作为开始时间间隔的一部分。不是所有活动单位在一小时内,如果我做一个正常的选择和分组,我会得到像

Time   UNIT     picks
11:00   2         5
12:00   3         14

因此,如果我在数据集中有100个订单,我会运行一个正常的分组查询并获得总共120个订单,因为它会拆分订单。我需要按照它的最低时间戳对我的单位进行分类。

4 个答案:

答案 0 :(得分:1)

这假设您的[TIME]字段实际上是TIME数据类型 - 可能需要CAST()。

-- sample data
DECLARE @StackOverflow TABLE (Unit INT, [TIME] TIME, Locatn VARCHAR(2), Picks INT)
INSERT INTO @StackOVerflow (Unit, [Time], Locatn, Picks) 
SELECT 1,     '11:50','L4',       2 UNION 
SELECT 2,     '11:51','m6',       3 UNION 
SELECT 3,     '12:01','L8',       4 UNION 
SELECT 2,     '12:03','A4',       2 UNION 
SELECT 1,     '12:05','B6',       3 UNION 
SELECT 3,     '12:06','C7',       1 UNION 
SELECT 1,     '12:10','D7',       4

-- confirm sample data
SELECT * FROM @StackOverflow

-- actual output
SELECT 
    DATEPART(HOUR,b.MinTime) StartHour,
    COUNT(DISTINCT a.Unit) Units,
    SUM(a.Picks) Picks
FROM 
    @StackOverflow a
     INNER JOIN 
      (
        SELECT Unit, MIN([TIME]) MinTime
        FROM @StackOverflow
        GROUP BY Unit 
      ) b ON 
        a.Unit = b.Unit
GROUP BY 
    DATEPART(HOUR,b.MinTime)

答案 1 :(得分:0)

到目前为止您所解释的内容:

Select
    To_Char(Time, HH) || ':00' as TimeHour,
    UNIT as UNIT,
    Sum(Picks) as Picks
From
    Table x
Group By
    To_Char(Time, HH)
    UNIT

答案 2 :(得分:0)

我派生了一个名为Interval的字段,以方便您正在寻找的分组。

查看SQL Fiddle上的解决方案。

答案 3 :(得分:0)

如果你使用mySQL那么你应该试试这个

mysql> select hour(time), count(unit), sum(picks) from picklist group by hour(time);

结果将是这样的

 hour(time) count(unit) sum(picks) 

11 2 5 12 2 7