我有关于需要按时间分类的选项列表时间戳的数据。对于每条记录,我有一个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个订单,因为它会拆分订单。我需要按照它的最低时间戳对我的单位进行分类。
答案 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