计算给定日期/间隔内使用的最大频道并指出这一天

count max channels used in given day / interval and point out this day

我有很多 CDR,想报告给定日期(每天,按天)的同步频道。

所以我简单地说,在晚上使用了 0 个频道(这是事实,我过滤掉了午夜后拨打的电话)-这对统计数据的影响非常小并简化了计算,我使用 well-know这个的光标(它是一个 T-SQL 但可以是更通用的方法)

(
  SELECT  date_start AS ts, +1 AS type,
    ROW_NUMBER() OVER(ORDER BY date_start) AS start_ordinal
  FROM [cdrs] with (nolock)
  WHERE bill_id in ( 12345 )   and date_start between '2021-01-01' and '2022-03-14' 
  UNION ALL
  SELECT  date_end, -1, NULL
  FROM [cdrs] with (nolock)
  WHERE bill_id in ( 12345 )   and date_start between '2021-01-01' and '2021-03-14'
),
C2 AS
(
  SELECT *,
    ROW_NUMBER() OVER( ORDER BY ts, TYPE ) AS start_or_end_ordinal
  FROM C1
)
SELECT  MAX(2 * start_ordinal - start_or_end_ordinal) AS max_channels
FROM C2
WHERE type = 1

(我还使用 nolock 来提高速度 - 只是一天必须结束,所有通话都必须结束,这样才能正常工作)。

我想达到的目标:

有这个 - 对于每一天 - 在那个时间段内,简单地使用“按年(),月(),日()分组”不是解决方案(给出错误答案) 也是下一步 - 为每一个可能的 bill_id (它是一个范围为 0..65535 的整数)

有没有人有任何好的方法,如 select 中的下一个 select(光标在光标中)或许多视图 - 看起来像是重新发明轮子。

如果没有看到示例数据和预期结果,很难确定,但您似乎想要每天同时发生的事件的最大数量。

所以我们可以进行以下操作:

  • 将开始时间和结束时间反透视到单独的行中,为每行添加数量差异:1 表示开始时间,-1 表示结束时间。
  • 计算该差异的滚动总和,按天划分。
  • 按天分组,取滚动总和的最大值。
SELECT
  t.date,
  maxSimultaneous = MAX(t.rollingQty)
FROM (
    SELECT
      date = CAST(v.ts AS date),
      v.ts,
      v.diffQuantity,
      rollingQty = SUM(v.diffQuantity) OVER (PARTITION BY CAST(v.ts AS date) ORDER BY v.ts ROWS UNBOUNDED PRECEDING)
    FROM cdrs
    CROSS APPLY (VALUES
      (cdrs.date_start, 1),
      (cdrs.date_end,  -1)
    ) v(ts, diffQuantity)
    WHERE cdrs.bill_id = 12345
      AND cdrs.date_start >= '2021-01-01'
      AND cdrs.date_start <  '2021-03-15'
) t
GROUP BY
  t.date;

Note the use of a half-open interval >= AND < for dates, rather than BETWEEN.