根据小时窗口获取数量总和

Posted

技术标签:

【中文标题】根据小时窗口获取数量总和【英文标题】:Get sum of qty based on hour window 【发布时间】:2021-10-18 20:24:36 【问题描述】:

我正在解决一个问题,以确定在特定时间之间创建和发送了多少产品。例如,我需要查看今天下午 6 点到明天下午 3 点之间创建了多少(创建的意思是使用 X 数量创建了多少订单)。我正在尝试为此创建一个时间箱,但无论我尝试什么都行不通。

select CREATE_DATE
    , CREATE_TIME
    , RELEASED_DATE
    , RELEASED_TIME
    , sum(case
        when CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0, CREATE_DATE), 0)
            and CREATE_TIME >= '18:00:00' AND CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0,             CREATE_DATE), 1)
        then ORDER_QTY
        when CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0, CREATE_DATE), 1)
            and CREATE_TIME <= '14:59:59'
        then ORDER_QTY
        end) as small_window_qty
    , sum(ORDER_QTY) as ord_qty
    , sum(RELEASED_QTY) as rls_qty
from table

对此的任何帮助将不胜感激。只需要一种方法将日子组织到以下存储桶中:正常时间窗口 = 下午 6 点到 6 点创建;较小的小时窗口 = 下午 6 点到 3 点创建;同意 = 下午 3 点(上午 12 点至下午 3 点)发货

编辑:一些澄清。我试图完成的是根本原因分析。我们有每天创建的订单,并且必须在创建后 2 天内发货。我们正试图弄清楚为什么我们的订单没有按时发货。因此,作为 RCA,我试图深入了解订单的创建时间、发货时间(或发布时间相同)以及发货时间。上述时间窗口是为某一天创建订单的截止时间。示例:

今天创建了 300 个单位,它们必须在 2 天后发货。我想看看,在创建的 300 个中,有多少是在下午 3 点之前创建的,其中有多少是在当天下午 3 点之前发送的。希望能澄清事情。并非所有创建的东西都必须在同一天发货,因为我们有 2 天的时间来运送订单。

【问题讨论】:

最好显示一些分布在 2 天(至少)内的样本数据,这些数据触及所有可能的窗口并显示哪些行属于哪些窗口。您的最后一个窗口有点令人担忧,因为它指的是“调度”而不是“创建”。这将有助于澄清您如何知道某些东西是“由...发送的”。 此外,如果您遇到转换问题,查看表定义(包括列名/类型)通常会有所帮助。 转换不是问题,只是在此处无法创建正确的表达式。我应该澄清一下,dispatch = Release,同样的事情。 @SM我已将结果添加到原始帖子中 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

你留下了很多信息,所以我在这里填补空白并做出假设。仔细检查我的数据类型是否与您的数据类型一致。

create table sales (create_date date, create_time time, released_date date, released_time time, qty int)

insert sales
select '1/14/13','18:45','1/15/13','10:45', 10
union all
select '1/14/13','19:45','1/15/13','12:45', 12
union all
select '1/15/13','19:15','1/16/13','16:45', 6
union all
select '1/15/13','18:00','1/16/13','14:45', 25
union all
select '1/15/13','18:45','1/16/13','15:00', 3
union all
select '1/16/13','19:45','1/17/13','16:30', 1
union all
select '1/16/13','20:45','1/17/13','17:45', 9
union all
select '1/17/13','18:30','1/18/13','18:00', 17
union all
select '1/18/13','18:30','1/19/13','17:15', 15
union all
select '1/18/13','18:45','1/19/13','19:15', 21

with base as
(
select *
, cast(create_date as datetime) + cast(create_time as datetime) as createtime
, cast(released_date as datetime) + cast(released_time as datetime) as releasetime
, datediff(hour,cast(create_date as datetime) + cast(create_time as datetime),cast(released_date as datetime) + cast(released_time as datetime)) as hrs
from sales
),

base2 as
(
select qty
, case
    when create_time >= '18:00' and hrs <= 21 then 'small'
    when create_time >= '18:00' and hrs <= 24 then 'normal'
    else 'outside'
end as orderwindow
, case
    when hrs between 6 and 21 then 'pass'
    else 'fail'
end as agreedupon
from base
)

select sum(qty) as qty, orderwindow, agreedupon
from base2
group by orderwindow, agreedupon

drop table sales

这应该让您能够判断创建了多少、它属于哪个时间窗口以及是否在下午 3 点之前发布。根据需要进行调整。

我不想让代码变得混乱和复杂,所以我使用了 2 个 CTE。

【讨论】:

非常感谢您的回答,您的回答很有帮助。我可以接受它并努力看看我是否可以改进它。我已经在我原来的帖子中发布了一些澄清,希望对您有所帮助。【参考方案2】:

我不确定您的预期结果,而且您​​的输入数据看起来杂乱无章且不清楚。所以我使用了上述答案提供的数据。看起来你得到了运行总和。如果您可以查看答案并在需要更多修改时与我联系,那就太好了。我建议您编辑您的问题,并更清楚地了解您的示例数据和预期答案。为问题添加更多详细信息。

create table sales (create_date date, create_time time, released_date date, released_time time, qty int)

INSERT INTO  sales
 select '1/14/13','18:45','1/15/13','10:45', 10
 union all
 select '1/14/13','19:45','1/15/13','12:45', 12
 union all
 select '1/15/13','19:15','1/16/13','16:45', 6
 union all
 select '1/15/13','18:00','1/16/13','14:45', 25
 union all
 select '1/15/13','18:45','1/16/13','15:00', 3
 union all
 select '1/16/13','19:45','1/17/13','16:30', 1
 union all
 select '1/16/13','20:45','1/17/13','17:45', 9
 union all
 select '1/17/13','18:30','1/18/13','18:00', 17
 union all
 select '1/18/13','18:30','1/19/13','17:15', 15
 union all
 select '1/18/13','18:45','1/19/13','19:15', 21


 SELECT 
   create_date
  , create_time
  , released_date 
  , released_time
 ,SUM(QTY) OVER ( PARTITION BY  A.[Dispatched Window] ORDER BY  released_date ) AS  [Sum_qty]
 ,Qty
  FROM
   (

  SELECT  
  create_date
 , create_time
 , released_date 
 , released_time
 , CASE WHEN  released_date BETWEEN      CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112)   + ' ' + CONVERT(CHAR(8), '18:00:00.0000000' , 108)) AND    CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(DAY,1, create_date), 112)   + ' ' + CONVERT(CHAR(8), '18:00:00.0000000' , 108))   THEN  'Normal Window'
        WHEN  released_date BETWEEN      CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112)   + ' ' + CONVERT(CHAR(8), '17:59:00.0000000' , 108)) AND    CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(DAY,1, create_date), 112)   + ' ' + CONVERT(CHAR(8), '15:00:00.0000000' , 108))   THEN  'Smaller Window'
        WHEN  released_date BETWEEN      CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112)   + ' ' + CONVERT(CHAR(8), '00:00:00.0000000' , 108)) AND    CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112)   + ' ' + CONVERT(CHAR(8), '15:00:00.0000000' , 108))   THEN  'Aggreed AUpon'
     ELSE 'N/A'
   END AS  [Dispatched Window]
  , Qty
 FROM dbo.sales
) AS A

【讨论】:

@silverwing90 你能检查一下这个答案,然后用你的示例数据和预期的输出回复我,这会很棒 非常感谢您的回答,但这并不是我所需要的。我在原来的帖子中发布了上面的一些说明。希望澄清足够 我检查了您的详细信息,但我有一个问题,如果您可以添加一些数据脚本示例和预期输出作为图像,我可以提供一点帮助。因为你的查询不是很清楚。那就是有人破坏了你的问题。我正在努力帮助你。但我需要提到的细节。谢谢@silverwing90

以上是关于根据小时窗口获取数量总和的主要内容,如果未能解决你的问题,请参考以下文章

SQL 在 72 小时内获取总和 > 10,000 的所有付款

获取连续值的总和

如何编写从多个表中获取多行数量总和的查询?

获取以太坊相关推文的数量(每小时)

如何获取单个整数/浮点列的总和达到某个值的行

sql中的条件总和,根据字段中的条件从另一个表中获取正确的总和