按类似类别分组

时间:2015-06-17 14:09:59

标签: sql sql-server sql-server-2008 group-by aggregates

我环顾四周,但找不到任何东西。

我有一个看起来像这样的表:

DATE       | Shift | Parts Used

1/1/15 1:15.....1........1

1/1/15 2:06.....1........2

1/1/15 3:45.....1........3

1/1/15 7:33.....2........1

1/1/15 8:14.....2........2

1/1/15 9:00.....2........3

1/1/15 23:01....1........1

1/1/15 23:55....1........2

我想按每个班次分组。不幸的转移有时可以在星期一早上结束,并在星期一晚上再次开始(有时我们的12小时轮班时间不完全是12小时)。有没有办法我可以按班次分组,基本上按班次分组,直到班次改变,即使我的日子是相同的(我的实际列也包含时间)?我可以写一个循环来分析数据,但从sql中获取它会很棒。

日期是对行进行排序。转移不能重叠。

希望我的结果会像

DATE | Shift | AVG parts used

1/1/15.....1........2

1/1/15.....2........2

1/1/15.....1........1.5

编辑******具有预期结果的最坏情况

DATE | Shift | AVG parts used

1/1/15.....1........1.8

1/1/15.....2........2

1 个答案:

答案 0 :(得分:0)

我假设班次1假设从午夜开始,班次2从中午开始,但有时会偏离一段时间。如果这些假设为真,则此查询应该有效。我已经制作了一个名为@ShiftFudgeHours的变量来说明轮班开始时间通常是多少。根据您的号码进行调整。从您的样本1小时看起来足够,但您可以轻松增加它。

declare @shiftFudgeHours int = 1

select convert(date, DATEADD(hh, @shiftFudgeHours, [date]) ) as [date]
    ,[shift]
    ,avg(convert(float, parts)) as AvgParts
from Table1
group by convert(date, DATEADD(hh, @shiftFudgeHours, [date]) ), [shift]
order by convert(date, DATEADD(hh, @shiftFudgeHours, [date]) ), [shift]