【问题标题】:Aggregating Timestamp聚合时间戳
【发布时间】:2017-12-26 21:32:48
【问题描述】:

我正在处理以下查询:

    SELECT contract,
     source_ref1 AS "ORDER_NO",
     part_no,
     ifsapp.inventory_part_api.Get_description( contract, part_no ) as "DESCRIPTION",
     ifsapp.inventory_part_api.Get_unit_meas( contract, part_no ) as "UNIT_MEAS",
     date_applied,
     (SELECT work_center_no FROM shop_order_operation where inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER",
    direction,
       SUM( quantity ) AS "QUANTITY",
       ( CASE
           WHEN ( ( To_char( date_time_created, 'HH24:MI ' ) BETWEEN '05:45 ' AND '17:44' ) AND
                  date_applied = date_created ) THEN 'SHIFT1'
           WHEN (( ( To_char( date_time_created, 'HH24:MI' ) BETWEEN '17:45' AND '24:00' )  OR
                   ( To_char( date_time_created, 'HH24:MI' ) BETWEEN '00:00' AND '05:44' ) AND
                   date_applied = date_created )) THEN 'SHIFT2'
           ELSE 'MANUAL_ADJUST'
         END ) AS "SHIFT"
FROM   ifsapp.INVENTORY_TRANSACTION_HIST2
WHERE  part_no IN (select pc.part_no from ifsapp.HH_INV_PART_CHARS pc where pc.accounting_group = '400') AND
       contract IN ( 'DE1', 'DE2' ) AND
       transaction_code LIKE '%REC%' AND
       direction IN ( '+', '-' ) AND
       source_ref_type = 'Shop Order' AND
       To_char( date_applied, 'YYYY-MM-DD' ) BETWEEN '2017-01-01' AND '2017-12-26'
GROUP BY contract,source_ref1, part_no, ifsapp.inventory_part_api.Get_description( contract, part_no ), 
ifsapp.inventory_part_api.Get_unit_meas( contract, part_no ), location_no, date_applied, direction,
date_time_created, date_created
ORDER  BY date_applied 

此查询返回 18292 个匹配项。

如果我删除 CASE 语句,并从 GROUP BY 部分中删除 DATE_TIME_CREATED 和 DATE_CREATED,则查询将返回 1356 个命中。

我们使用 CASE 语句来确定我们的产品产生了什么转变。 date_time_created 字段基本上是一个时间戳。这是该表上唯一可以用来确定产品生产班次的字段。

但是,它也导致我们获得的点击数是没有它时的 10 倍。

以 ORDER_NO 349321 为例。如图所示运行查询,我得到 61 次点击。删除 CASE 语句,并从 GROUP BY 部分中删除 DATE_TIME_CREATED 和 DATE_CREATED,我得到两个命中。

我们没有两班倒完成的订单。因此,我不需要知道 ORDER_NO 349321 的每笔交易的时间戳,也不需要知道每个时间戳是在 Shift 1 还是 Shift 2。我只需要知道该订单的交易是否是在 Shift 1 或 Shift 2 中完成。

有没有什么方法可以汇总我从案例陈述中获得的信息来解决这个问题?我尝试在我的 case 语句中使用 MAX 和 AVG,但它返回的结果数量相同。

【问题讨论】:

  • 提供有代表性的数据样本和期望的结果。
  • 除非您是故意这样做的,否则您在“SHIFT 2”计算中的 OR 条件周围似乎缺少一组括号。现在的方式是,“AND”条件不被视为“AND”,因为 OR 没有链接到任何其他条件。 ( ( ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '17:45' AND '24:00' ) OR ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '00:00' AND '05:44' ) AND date_applied = date_created ) )这并不能解决您最初的问题,但现在需要注意。

标签: sql oracle11g timestamp case aggregate-functions


【解决方案1】:

如果您不需要投影 DATE_TIME_CREATED 和 DATE_CREATED 列,请在进行聚合处理之前尝试在子查询中进行“SHIFT”计算。像这样的:

SELECT 
    contract,
    source_ref1 AS "ORDER_NO",
    part_no,
    ifsapp.inventory_part_api.Get_description( contract, part_no ) AS "DESCRIPTION",
    ifsapp.inventory_part_api.Get_unit_meas( contract, part_no ) AS "UNIT_MEAS",
    date_applied,
    (SELECT work_center_no FROM shop_order_operation WHERE inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER",
    direction,
    SUM(quantity) AS "QUANTITY",
    "SHIFT"
FROM 
(
    SELECT contract, source_ref1, part_no, date_applied, direction, quantity, 
    ( CASE
       WHEN ( ( TO_CHAR( date_time_created, 'HH24:MI ' ) BETWEEN '05:45 ' AND '17:44' ) AND
              date_applied = date_created ) THEN 'SHIFT1'
       WHEN (( ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '17:45' AND '24:00' )  OR
               ( TO_CHAR( date_time_created, 'HH24:MI' ) BETWEEN '00:00' AND '05:44' ) AND
               date_applied = date_created )) THEN 'SHIFT2'
       ELSE 'MANUAL_ADJUST'
     END ) AS "SHIFT"
    FROM ifsapp.INVENTORY_TRANSACTION_HIST2
    WHERE part_no IN (SELECT pc.part_no FROM ifsapp.HH_INV_PART_CHARS pc WHERE pc.accounting_group = '400') 
    AND contract IN ( 'DE1', 'DE2')
    AND transaction_code LIKE '%REC%' 
    AND direction IN ( '+', '-') 
    AND source_ref_type = 'Shop Order' 
    AND TO_CHAR( date_applied, 'YYYY-MM-DD') BETWEEN '2017-01-01' AND '2017-12-26'
) src
GROUP BY 
    contract,
    source_ref1, 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no), 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no), 
    location_no, 
    date_applied, 
    direction
--  ,date_time_created, 
--  date_created
ORDER  BY date_applied 

我没有任何 DDL/数据来测试查询,因此您肯定会遇到一些语法错误。但是试一试,让我知道结果如何。

另外,检查你的“SHIFT”计算,看起来你有一个浮动的“OR”,没有括号。

【讨论】:

  • 你知道了我的朋友 :)
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 2020-01-12
  • 2021-02-05
  • 1970-01-01
  • 2023-03-11
  • 2016-09-24
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多