【问题标题】:Oracle SQL: Count and sum in e.g. 4 hours?Oracle SQL:计数和求和,例如4个小时?
【发布时间】:2013-03-01 09:32:31
【问题描述】:

我有一个关于已经解决的 Q (Oracle SQL: Counting in 4h?) 的后续问题。

如果数据样本中还有另一列,金额列,我想按照解决方案中的建议进行操作

select t.*, 
from (select t.*, lag(dt, 6) over (partition by employeeId order by dt) as ord6dt
      from t
     ) t
where dt - ord6dt < 4.0/24

,有一个额外的条件和金额列> 10?

所以查询应该只列出那些在 4 小时内有 6 个订单并且 sum(order_value)&gt;10 的人。

【问题讨论】:

  • 我编辑了你的标签。 MySQL 来自 oracle,是的,但您不使用它(我可以通过查询语法来判断)。请具体说明您使用的是哪个数据库。
  • 您是否尝试将SUM(Amount) OVER (partition by employeeid) 添加到您的内联查询中?
  • 大声哭泣的 4 小时是什么? :)
  • 是的,刚刚试了一下,不管是不是在4小时的时间段内,它都会汇总所有订单。
  • 好的,抱歉,4h 意味着 4 小时对我来说很自然,我会记住这一点。

标签: sql function stored-procedures oracle11g


【解决方案1】:

您刚刚回顾 6 行的解决方案(这可能不是满足 4 小时前的第一个订单)。因此,添加另一个分析以保持该解决方案:

select *
from (select t1.*, lag(dt, 6) over (partition by employee order by dt) as ord6dt,
             sum(order_value) over (partition by employee order by dt rows 6 preceding) val
      from emptest t1
     ) 
where dt - ord6dt < 4.0/24
  and val >= 10;

将再次只计算 6 行(如果我们在过去四个小时内有超过 6 个订单,这可能会错过一些真正的匹配)。

我们可以改为建模:

select *
  from (select *
          from emptest
        model
        dimension by (employee, dt)
        measures (  order_value, order_id, 0 order_sum, 0 number_of_orders)
        rules (
          order_sum[any,any] = sum(order_value)[cv(employee), dt between cv(dt)-(4/24) and cv(dt)],
          number_of_orders[any,any] = count(*)[cv(employee), dt between cv(dt)-(4/24) and cv(dt)]

        ))
 where order_sum > 10
   and number_of_orders >= 6
order by employee, dt;

它会在 4 或更多时查找 number_of_orders,并且还会检查 4 小时内的计数。

小提琴:http://sqlfiddle.com/#!4/3045d/1

【讨论】:

  • 解决方案的第二部分很棒,它为我提供了我需要的一切。但是我对您在第一句中的评论有疑问:这可能不是满足 4 小时前的第一个订单,在那个查询中,我不想知道确切的订单数量,只要 currnet 订单(选择正在检查)是过去 4 小时内的第 6 个,然后用 dt 标记它。总体而言,这可能在过去 4 小时内实际上排在第 10 位,但之前也有 5 个订单……没关系,通过您的第二个解决方案,我得到了所有信息,tnx
  • 嗨,再一次,这个查询在有 10k 条记录的示例数据库上工作得很好,但是当我尝试在有更多记录的数据库上运行它并且运行速度非常慢时,这是正常的吗?我应该在哪些列上建立索引,在那些来自 Dimension 的列上?您还有其他减少处理时间的建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多