Sql Oracle在昨天一小时内未返回任何数据
我有以下疑问:Sql Oracle在昨天一小时内未返回任何数据,sql,oracle,Sql,Oracle,我有以下疑问: 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
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
但由于“having”子句,它不会返回任何结果。我知道它应该返回结果,因为我希望它只在一列中显示当前时间段的V_ATT,在第二列中显示24小时前的V_ATT。我已经检查了数据,我应该会得到结果,但我似乎不明白为什么这不起作用……如果你小计(分组)D_DTM,你会得到每个日期一行。如果您想在同一行中比较两个日期,您需要做两件事中的一件:子查询,或者像lag/lead这样的窗口函数
我想这就是你想要的:
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
请注意,lag/over中的
分区依据
列是分组依据
列的子集。我使用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
此条件
D_DTM=(D_DTM-24/24)
始终为FALSE。您的查询错误且难以读取。您需要添加示例数据。什么数据类型是D_DTM
?您在某些地方将D_DTM视为日期,在其他地方将其视为字符串。如果是DD/MM/YYYY字符串,则不能对其进行MAX()或减法。如果它是一个日期,那么您不需要将它转换为具有to_DATE()的日期。我认为分区依据在我的情况下不起作用,因为分区依据查看行数。。。