Per Color 同时使用的 bin 的最大数量
Per Color the max amount of bins used at the same time
我有以下数据集:
CREATE TABLE #boxColor
(Color varchar(15)
,BoxId int
,AddedOn datetime2
,DeactivatedOn datetime2)
INSERT INTO #boxColor(Color, BoxId, AddedOn, DeactivatedOn)
VALUES
('Black',1,'4/11/19 2:02 PM','12/31/99 12:00 AM'),
('Black',6,'4/12/19 11:16 AM','12/31/99 12:00 AM'),
('Black',7,'4/12/19 12:25 PM','12/31/99 12:00 AM'),
('blue',21,'4/12/19 1:14 PM','12/31/99 12:00 AM'),
('blue',31,'6/5/19 2:03 PM','12/31/99 12:00 AM'),
('yellow',32,'6/5/19 2:15 PM','8/8/19 4:53 PM'),
('orange',3,'6/7/19 9:01 AM','6/7/19 10:28 AM'),
('blue',34,'6/7/19 10:26 AM','6/7/19 11:20 AM'),
('orange',35,'6/7/19 10:28 AM','6/7/19 11:42 AM'),
('yellow',36,'6/7/19 11:20 AM','12/31/99 12:00 AM')
我正在尝试获取每个颜色箱的列表,以及曾经使用过的该颜色的最大数量
我似乎无法理解这个问题。
如果我能以任何方式澄清,请告诉我。
您需要首先将事件日期(添加和停用)反透视到单独的行中。
然后计算每个事件之间数量差异的 运行 总和。
然后简单地分组并取最大值。
SELECT
bc.Color,
PeakQty = MAX(bc.RunningSum)
FROM (
SELECT *,
RunningSum = SUM(v.DiffQty) OVER (PARTITION BY bc.Color
ORDER BY v.EventDate ROWS UNBOUNDED PRECEDING)
FROM boxColor bc
CROSS APPLY (VALUES
(bc.AddedOn, 1),
(bc.DeactivatedOn, -1)
) v(EventDate, DiffQty)
) bc
GROUP BY
bc.Color;
详细说明其工作原理:
- 我们获取每个
AddedOn
和 DeactivatedOn
日期,并将它们逆透视到单独的行中。对于前者,我们有一个 DiffQty
的 +1 和后者 -1.
- 现在将行视为事件:添加和删除。
- 然后我们按顺序对所有这些日期进行排序(按
Color
划分)....
- ... 然后我们计算
DiffQty
的 运行 总和,按这些非透视日期排序(并按 Color
分区)。这意味着每个事件都会从 运行 总和中增加或减少 1。
- 然后我们可以简单地按
Color
分组,并取我们拥有的最高 RunningSum
值。
我有以下数据集:
CREATE TABLE #boxColor
(Color varchar(15)
,BoxId int
,AddedOn datetime2
,DeactivatedOn datetime2)
INSERT INTO #boxColor(Color, BoxId, AddedOn, DeactivatedOn)
VALUES
('Black',1,'4/11/19 2:02 PM','12/31/99 12:00 AM'),
('Black',6,'4/12/19 11:16 AM','12/31/99 12:00 AM'),
('Black',7,'4/12/19 12:25 PM','12/31/99 12:00 AM'),
('blue',21,'4/12/19 1:14 PM','12/31/99 12:00 AM'),
('blue',31,'6/5/19 2:03 PM','12/31/99 12:00 AM'),
('yellow',32,'6/5/19 2:15 PM','8/8/19 4:53 PM'),
('orange',3,'6/7/19 9:01 AM','6/7/19 10:28 AM'),
('blue',34,'6/7/19 10:26 AM','6/7/19 11:20 AM'),
('orange',35,'6/7/19 10:28 AM','6/7/19 11:42 AM'),
('yellow',36,'6/7/19 11:20 AM','12/31/99 12:00 AM')
我正在尝试获取每个颜色箱的列表,以及曾经使用过的该颜色的最大数量
我似乎无法理解这个问题。
如果我能以任何方式澄清,请告诉我。
您需要首先将事件日期(添加和停用)反透视到单独的行中。
然后计算每个事件之间数量差异的 运行 总和。
然后简单地分组并取最大值。
SELECT
bc.Color,
PeakQty = MAX(bc.RunningSum)
FROM (
SELECT *,
RunningSum = SUM(v.DiffQty) OVER (PARTITION BY bc.Color
ORDER BY v.EventDate ROWS UNBOUNDED PRECEDING)
FROM boxColor bc
CROSS APPLY (VALUES
(bc.AddedOn, 1),
(bc.DeactivatedOn, -1)
) v(EventDate, DiffQty)
) bc
GROUP BY
bc.Color;
详细说明其工作原理:
- 我们获取每个
AddedOn
和DeactivatedOn
日期,并将它们逆透视到单独的行中。对于前者,我们有一个DiffQty
的 +1 和后者 -1. - 现在将行视为事件:添加和删除。
- 然后我们按顺序对所有这些日期进行排序(按
Color
划分).... - ... 然后我们计算
DiffQty
的 运行 总和,按这些非透视日期排序(并按Color
分区)。这意味着每个事件都会从 运行 总和中增加或减少 1。 - 然后我们可以简单地按
Color
分组,并取我们拥有的最高RunningSum
值。