【问题标题】:Oracle not returning any data for yesterdays hourOracle 没有返回昨天一小时的任何数据
【发布时间】:2013-04-22 20:00:35
【问题描述】:

我有以下疑问:

SELECT d_dtm,
       BTS_ID,
       CASE WHEN D_DTM = (D_DTM-24/24)
            THEN sum(V_ATT_CNT)
       END AS "LASTATT",

       sum(V_ATT_CNT) as "V_ATT_CNT",

       CASE WHEN D_DTM = D_DTM
            THEN sum(V_ATT_CNT)
       END AS "ATT"

 FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI

WHERE to_date(D_DTM, 'DD/MM/yyyy') >=
      (SELECT TO_DATE(max(D_DTM),'DD/MM/YYYY') 
         FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI)-2

GROUP BY d_dtm,
        BTS_ID

HAVING CASE WHEN D_DTM = (D_DTM-24/24)
           THEN sum(V_ATT_CNT)                
       END > 0

但由于“有”子句,它没有返回任何结果。我知道它应该返回结果,因为我想要它做的只是在一列中有当前时间段的 V_ATT,而在第二列中,有 24 小时前的 V_ATT。我检查了数据,我应该得到结果,但似乎无法弄清楚为什么这不起作用......

【问题讨论】:

  • 此条件D_DTM = (D_DTM-24/24) 始终为 FALSE。
  • 您的查询错误且难以阅读。您需要添加示例数据。
  • D_DTM 是什么数据类型?
  • 您在某些地方将 D_DTM 视为日期,而在其他地方则视为字符串。如果它是 DD/MM/YYYY 字符串,则不能 MAX() 也不能从中减去。如果是 DATE,则无需使用 TO_DATE() 将其转换为日期。

标签: sql oracle


【解决方案1】:

如果您对 D_DTM 进行小计(分组依据),则每个日期都会得到一行。如果您想比较同一行中的两个日期,您需要做以下两件事之一:子查询或像滞后/领先这样的窗口函数。

我想这就是你要找的东西:

SELECT d_dtm,
   BTS_ID,
   lag(sum(V_ATT_CNT), 1) over (partition by bts_id order by d_dtm) 
      AS "LASTATT",
   sum(V_ATT_CNT) as "V_ATT_CNT"

 FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI

  WHERE to_date(D_DTM, 'DD/MM/yyyy') >=
     (SELECT TO_DATE(max(D_DTM),'DD/MM/YYYY') 
         FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI)-2

 GROUP BY d_dtm,
    BTS_ID

请注意,滞后/结束中的partition by 列是group by 列的子集

【讨论】:

  • 我不认为 partition by 在我的情况下会起作用,因为 partition by 查看行数...
【解决方案2】:

我使用 with 语句和两个查询重新编写了查询。工作得很快,给了我正确的结果。

   WITH FRST
        AS (  SELECT D_DTM,
                     BSM_NM,
                     SUM (V_ATT_CNT) AS "V_ATT_CNT",
                     SUM (V_CUST_BLK_CNT) AS "V_CUST_BLK_CNT",
                     SUM (V_DRP_CALL_CNT) AS "V_DRP_CALL_CNT",
                     SUM (D_ATT_CNT) AS "D_ATT_CNT",
                     SUM (D_CUST_BLK_CNT) AS "D_CUST_BLK_CNT",
                     SUM (D_DRP_CALL_CNT) AS "D_DRP_CALL_CNT"
                FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI
               WHERE D_DTM >=
                        (SELECT MAX (D_DTM) - NUMTODSINTERVAL (12, 'HOUR')
                           FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI)
            GROUP BY D_DTM, BSM_NM),
        LST
        AS (  SELECT D_DTM,
                     BSM_NM,
                     SUM (V_ATT_CNT) AS "V_ATT_CNT",
                     SUM (V_CUST_BLK_CNT) AS "V_CUST_BLK_CNT",
                     SUM (V_DRP_CALL_CNT) AS "V_DRP_CALL_CNT",
                     SUM (D_ATT_CNT) AS "D_ATT_CNT",
                     SUM (D_CUST_BLK_CNT) AS "D_CUST_BLK_CNT",
                     SUM (D_DRP_CALL_CNT) AS "D_DRP_CALL_CNT"
                FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI
               WHERE D_DTM >=
                        (SELECT MAX (D_DTM) - NUMTODSINTERVAL (48, 'HOUR')
                           FROM DMSN.DS3R_FH_1XRTT_FA_LVL_KPI)
            GROUP BY D_DTM, BSM_NM),
        EVDOLST
        AS (  SELECT D_DTM,
                     BSM_NM,
                     SUM (ATT_CNT) AS "ATT_CNT",
                     SUM (CUST_BLK_CNT) AS "CUST_BLK_CNT",
                     SUM (DRP_CALL_CNT) AS "DRP_CALL_CNT"
                FROM DMSN.DS3R_FH_EVDO_FA_LVL_KPI
               WHERE D_DTM >=
                        (SELECT MAX (D_DTM) - NUMTODSINTERVAL (48, 'HOUR')
                           FROM DMSN.DS3R_FH_EVDO_FA_LVL_KPI)
            GROUP BY D_DTM, BSM_NM),
        EVDOFRST
        AS (  SELECT D_DTM,
                     BSM_NM,
                     SUM (ATT_CNT) AS "ATT_CNT",
                     SUM (CUST_BLK_CNT) AS "CUST_BLK_CNT",
                     SUM (DRP_CALL_CNT) AS "DRP_CALL_CNT"
                FROM DMSN.DS3R_FH_EVDO_FA_LVL_KPI
               WHERE D_DTM >=
                        (SELECT MAX (D_DTM) - NUMTODSINTERVAL (12, 'HOUR')
                           FROM DMSN.DS3R_FH_EVDO_FA_LVL_KPI)
            GROUP BY D_DTM, BSM_NM)
   SELECT t1.D_DTM,
          t1.BSM_NM,
          t2.V_ATT_CNT AS "LASTV_ATTCNT",
          t2.V_CUST_BLK_CNT AS "LASTV_BLKCNT",
          t2.V_DRP_CALL_CNT AS "LASTV_DRPCNT",
          t1.V_ATT_CNT AS "V_ATT_CNT",
          t1.V_CUST_BLK_CNT AS "V_CUST_BLK_CNT",
          t1.V_DRP_CALL_CNT AS "V_DRP_CALL_CNT",
          t2.D_ATT_CNT AS "LASTD_ATTCNT",
          t2.D_CUST_BLK_CNT AS "LASTD_BLKCNT",
          t2.D_DRP_CALL_CNT AS "LASTD_DRPCNT",
          t1.D_ATT_CNT AS "D_ATT_CNT",
          t1.D_CUST_BLK_CNT AS "D_CUST_BLK_CNT",
          t1.D_DRP_CALL_CNT AS "D_DRP_CALL_CNT",
          t3.ATT_CNT AS "EVDO_ATTCNT",
          t3.CUST_BLK_CNT AS "EVDO_BLKCNT",
          t3.DRP_CALL_CNT AS "EVDO_DRPCNT",
          t4.ATT_CNT AS "EVDO_LASTATTCNT",
          t4.CUST_BLK_CNT AS "EVDO_LASTBLKCNT",
          t4.DRP_CALL_CNT AS "EVDO_LASTDRPCNT"
     FROM FRST t1
          INNER JOIN LST t2
             ON     t1.BSM_NM = t2.BSM_NM
                AND t1.D_DTM - NUMTODSINTERVAL (24, 'HOUR') = t2.D_DTM
          LEFT OUTER JOIN EVDOLST t4
             ON     t1.BSM_NM = t4.BSM_NM
                AND t1.D_DTM - NUMTODSINTERVAL (24, 'HOUR') = t4.D_DTM
          LEFT OUTER JOIN EVDOFRST t3
             ON t1.BSM_NM = t3.BSM_NM AND t1.D_DTM = t3.D_DTM

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2014-03-21
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多