如何从oracle SQL查询中过滤掉最后一个当前小时?

问题描述 投票:0回答:1

对 SQL 相当陌生,并尝试构建一些简单的查询来减少我对强大查询的依赖! 我有一份报告,只需要在最终结果中显示历史时间数据,不包括当前时间。我已经成功构建了一些可行的东西,但不知道如何删除最后一个小时!现在这个查询可能不是最短或最雄辩的,但它有效,所以请耐心等待我:)并随意建议任何替代方案(我通过实际尝试做某事来学得最好)

SELECT 
lt."Date",
lt."day" "Day",
concat(lt."Integrated In", ':00') "Integrated In",
lt."Qty Ordered",
rt."Qty Ordered" "Sum Ordered",
round((lt."Qty Ordered"/rt."Qty Ordered")*100,2) "Percentage",
sum (lt."Qty Ordered") over (order by lt."Integrated In" rows unbounded preceding 
       ) "Rolling Total"
FROM 
(select
TRUNC(oh.creation_date AT TIME ZONE 'Europe/London') as "Date",
extract(hour from  oh.creation_date AT TIME ZONE 'Europe/London') as "Integrated In",
to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY') "day",
COUNT (ol.qty_ordered) as "Qty Ordered"
from order_header oh
full join order_line ol
on oh.order_id = ol.order_id
WHERE TRUNC(oh.creation_date AT TIME ZONE 'Europe/London') = TO_DATE(SYSDATE)
AND oh.order_type IN ('UKDCSTDRM', 'UKDCEXPRM', 'UKDCPOPRM', 'UKDCAPRM', 'UKDCEXPUP', 'UKDCSTDUP', 'UKDCAPUPS', 'UKDCPOPUP')
Group By TRUNC(oh.creation_date AT TIME ZONE 'Europe/London'), to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY'), extract(hour from  oh.creation_date AT TIME ZONE 'Europe/London')
Order By to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY'), extract(hour from  oh.creation_date AT TIME ZONE 'Europe/London')) lt

full join 

(select 
to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY') "day",
SUM (ol.qty_ordered) as "Qty Ordered"
from order_header oh
full join order_line ol
on oh.order_id = ol.order_id
WHERE TRUNC(oh.creation_date AT TIME ZONE 'Europe/London') = TO_DATE(SYSDATE)
AND oh.order_type IN ('UKDCSTDRM', 'UKDCEXPRM', 'UKDCPOPRM', 'UKDCAPRM', 'UKDCEXPUP', 'UKDCSTDUP', 'UKDCAPUPS', 'UKDCPOPUP')
Group by to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY')
Order By to_char(oh.creation_date AT TIME ZONE 'Europe/London', 'DAY')) rt 

on lt."day" = rt."day"

所以我不知所措,我知道我可以将日期截断到一个小时,但在我尝试代码的任何地方,它要么根本不过滤,要么过滤所有内容!

这是代码

WHERE TRUNC(oh.creation_date AT TIME ZONE 'Europe/London') < TRUNC(TO_DATE(SYSDATE),'HH')

当前最终结果如下所示,但结果需要省略最后一个小时(以下示例中的 10:00)

current final result

有什么想法吗?

sql oracle-sqldeveloper
1个回答
0
投票

如果没有一些示例数据和该示例数据的预期输出,就很难测试您的代码。但是,您似乎想要:

  • 将数据过滤为仅今天的数据(伦敦时区)
  • 每小时产生
    COUNT
  • 每天生成总共
    COUNT
    (尽管您使用的是
    SUM
    而不是
    COUNT
    ,这是一个错误吗?)
  • 过滤聚合计数以排除当前小时。
  • 显示日期、星期、小时、每小时数量、当日总量、百分比和累计总量。

您可以使用以下方法做到这一点:

SELECT TRUNC(creation_hour) AS "Date",
       TO_CHAR(creation_hour, 'FMDAY') AS day,
       TO_CHAR(creation_hour, 'HH24:MI') AS "Integrated In",
       qty_ordered_hour,
       total_ordered_day,
       ROUND(qty_ordered_hour/total_ordered_day*100, 2) AS percentage,
       SUM(qty_ordered_hour) OVER (ORDER BY created_hour) AS rolling_total
FROM   (
  SELECT TRUNC(oh.creation_date AT TIME ZONE 'Europe/London', 'HH24') AS creation_hour,
         COUNT(ol.qty_ordered) as qty_ordered_hour,
         SUM(COUNT(ol.qty_ordered)) OVER () AS total_ordered_day
  FROM   order_header oh
         FULL OUTER JOIN order_line ol
         ON oh.order_id = ol.order_id
  WHERE  TRUNC(oh.creation_date AT TIME ZONE 'Europe/London')
           = TRUNC(SYSTIMESTAMP AT TIME ZONE  'Europe/London')
  AND    oh.order_type IN ('UKDCSTDRM', 'UKDCEXPRM', 'UKDCPOPRM', 'UKDCAPRM', 'UKDCEXPUP', 'UKDCSTDUP', 'UKDCAPUPS', 'UKDCPOPUP')
  GROUP BY 
         TRUNC(oh.creation_date AT TIME ZONE 'Europe/London', 'HH24')
)
WHERE  creation_hour < TRUNC(SYSTIMESTAMP AT TIME ZONE  'Europe/London', 'HH')

如果您不想将当前小时的值包含在每日总计中,请将最终的

WHERE
过滤器移至子查询中。

© www.soinside.com 2019 - 2024. All rights reserved.