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;

db<>fiddle

详细说明其工作原理:

  • 我们获取每个 AddedOnDeactivatedOn 日期,并将它们逆透视到单独的行中。对于前者,我们有一个 DiffQty 的 +1 和后者 -1.
  • 现在将行视为事件:添加和删除。
  • 然后我们按顺序对所有这些日期进行排序(按 Color 划分)....
  • ... 然后我们计算 DiffQty 的 运行 总和,按这些非透视日期排序(并按 Color 分区)。这意味着每个事件都会从 运行 总和中增加或减少 1。
  • 然后我们可以简单地按 Color 分组,并取我们拥有的最高 RunningSum 值。